列举窗口

Enumerating Windows?

本文关键字:窗口      更新时间:2023-10-16

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

您似乎对缓冲区的长度撒了谎。你分配了len个字符,然后说缓冲区的大小是len+1。您需要分配len+1个字符。

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

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

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

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