【发布时间】:2013-04-15 00:03:21
【问题描述】:
我正在制作一个需要 Skype 窗口中的一些信息的应用程序,我找到了主窗口和子窗口。我使用 WM_GETTEXT 并在消息框中显示缓冲区。换了几次联系人后好像不行了。谁能猜猜为什么几秒钟后会中断?
case 2000:
//Make options window here
int len;
char* buffer;
HWND hWnd; //Main Window
HWND chat; //Tconversation form, Caption is the contact's name.
hWnd = FindWindow(L"tSkMainForm", NULL); //tSkMainForm is SKYPE
chat = FindWindowEx(hWnd, NULL, L"TConversationForm", NULL); //GetWindow(hWnd,GW_CHILD);
if (IsWindowVisible(chat)) {
len = SendMessage(chat, WM_GETTEXTLENGTH, 0, 0);
buffer = new char[len];
SendMessageW(chat, WM_GETTEXT, (WPARAM) len + 1, (LPARAM) buffer);
MessageBox(HWND_DESKTOP, (LPCWSTR) buffer, L"Testing", MB_OK);
} else MessageBox(HWND_DESKTOP, L"We cannot find the window.", L"About Testing", MB_OK);
break;
所以只是给你一个事件的时间表,这就是发生的事情。
我将我的 DLL 注入 Skype,它会创建一个菜单,一切正常。当我按下新创建的按钮(ID 2000)时,我想获取联系人的姓名。 Spy++ 告诉我“TConversationForm”的标题是联系人的姓名。这适用于最初的几个联系人,但随后 Skype 崩溃。
我知道我可以使用 Skype API,但我更多地将其用作学习目的,而不是制作工作工具。
【问题讨论】:
-
您是否尝试过在调试器中附加到 Skype,以便了解应用程序崩溃的位置?如果您的代码直接导致了崩溃,它应该进入调试器并直接将您带到文件中发生崩溃的行。
-
我看到
buffer = new char[len];匹配的delete[]在哪里?我建议你使用操作系统函数(例如HeapAlloc)代替注入代码,因为你不控制 Skype 使用的 C++ 运行时。 -
使用无障碍界面。这就是他们的目的
-
@Ben Skype 不使用 C++ 运行时。这是一个德尔福应用程序。查看类名。
-
@cole 按钮的id根据q