1

我正在制作一个需要 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,但我更多地将其用作学习目的,而不是制作工作工具。

4

1 回答 1

3

您似乎在说谎缓冲区的长度。您分配 len 个字符,然后说缓冲区的大小为 len+1。您需要分配 len+1 个字符。

Windows 上的 Skype 是一个 Delphi 应用程序,使用 VCL 控件构建。VCL 使用的设计有时会导致在窗体的生命周期内重新创建窗口。换句话说,窗口句柄可以更改,您可能会留下一个陈旧的句柄。这是另一种似是而非的失败模式。

另一种可能的故障模式是,您正在以应用程序不知道的方式从非 GUI 线程中弄乱 GUI。很有可能在 VCL 背后添加一个菜单就足以导致失败。

您不应该将 HWND_DESKTOP 用作窗口所有者,并且您似乎泄漏了该文本缓冲区。

我认为你在这条道路上成功的几率很低。非常低。我建议您使用受支持的自动化界面。

于 2013-04-15T00:24:01.337 回答