列举窗口
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作为窗口所有者,并且您似乎泄漏了该文本缓冲区。
我认为你在这条路上成功的几率很低。非常低。我建议您使用受支持的自动化接口。
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取 GLFW 窗口 ID?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 用于窗口的 HID 终端
- SFML 文本未绘制在窗口上
- 如何为窗口截屏
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息