我正在制作一个需要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,但我将其作为学习目的而不是制作工具。
答案 0 :(得分:3)
你似乎在说谎缓冲区的长度。您分配len个字符,但后面说缓冲区的大小为len + 1。你需要分配len + 1个字符。
Skype on Windows是一个使用VCL控件构建的Delphi应用程序。 VCL使用的设计有时会导致窗体在窗体生命周期内重新创建。换句话说,窗口句柄可以改变,你可以留下陈旧的句柄。这是另一种看似合理的失败模式。
另一种可能的失败模式是你正在以一种应用程序不知道的方式从非GUI线程中弄乱GUI。很可能在VCL后面添加菜单足以导致失败。
您不应该使用HWND_DESKTOP作为窗口所有者,并且您似乎泄漏了该文本缓冲区。
我认为你在这条道路上取得成功的几率很低。非常低。我建议您使用支持的自动化界面。