gpt4 book ai didi

c++ - 枚举窗口?

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:38 25 4
gpt4 key购买 nike

我正在制作一个需要来 self 的 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 注入(inject) Skype,它生成了一个菜单,一切正常。当我按下新创建的按钮(ID 2000)时,我想获取联系人的姓名。 Spy++ 告诉我“TConversationForm”的标题是联系人的姓名。这适用于前几个联系人,但随后 Skype 崩溃。

我知道我可以使用 Skype API,但我将其更多地用作学习目的,而不是制作工作工具。

最佳答案

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

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

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

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

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

关于c++ - 枚举窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16005768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com