正在查找另一个程序的BUTTON
Finding BUTTON of another program
我正试图让我的程序单击另一个程序的按钮。我遇到问题的部分是识别按钮的手柄。这是我迄今为止的代码:
BOOL CALLBACK EnumChildProc(HWND windowHandle, LPARAM lParam)
{
cout << "hwnd_Child = " << windowHandle << endl;
cout<<"WindowId: "<<GetWindowLongPtr(windowHandle, GWLP_ID)<<endl;
return TRUE;
}
HWND windowHandle = FindWindow(NULL, "nameOfProgramWindow");
EnumChildWindows(windowHandle, EnumChildProc, 0);
到目前为止,我找到了程序的父窗口的句柄。有了这个句柄,我使用EnumChildWindows函数来遍历每个子窗口。。。在其中一个子窗口中,我会有一个包含3个按钮的窗口,其中1个是我想按下的按钮。在回调函数中,我需要放入GetWindowLongPtr()函数来获取我要查找的窗口的ID。。。但是有一个问题。。。
问题是,每次我再次运行这个程序时,包含按钮的窗口的句柄和ID都会发生变化。。。所以我不能用spy++获取ID来与ID更改后获得的ID进行比较。我甚至已经测试过了(这就是为什么我有所有的"cout"代码);
问题:然后我如何识别我在回调函数中要查找的窗口(可能还有我要查找的按钮)??请不要说spy++导致每次打开程序时ID和Handle值都会更改
每次运行代码时,句柄总是会发生更改。Windows动态分配句柄。你或其他人对此无能为力。如果它没有改变,那将更加令人惊讶。
控件的ID更改并不是什么特别的阴谋。唯一保持不变的方法是在原始应用程序中对其进行硬编码,很可能是通过使用资源文件。但是,如果程序员在运行时动态生成控件,那么他们就没有理由需要使用相同的ID。只要他们在需要时在某种数据结构中跟踪该ID即可。
您可以找到按钮控件的另一个常量属性,比如标题。但这肯定不能保证。许多程序更改标题以反映当前状态。
应用程序开发人员没有义务让另一个程序轻松地处理不属于他们的东西的内部。
您是否考虑过使用UI Automation以正确的方式执行此操作?
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- MFC:如果程序以前在最大化状态下关闭,则'Maximized Button'错误
- 正在查找另一个程序的BUTTON