正在查找另一个程序的BUTTON

Finding BUTTON of another program

本文关键字:BUTTON 程序 另一个 查找      更新时间:2023-10-16

我正试图让我的程序单击另一个程序的按钮。我遇到问题的部分是识别按钮的手柄。这是我迄今为止的代码:

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以正确的方式执行此操作?