枚举Windows?

时间:2013-04-15 00:03:21

标签: c++ c dll

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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