找到另一个程序的BUTTON

时间:2014-04-21 20:59:43

标签: c++ winapi

我正在尝试让我的程序单击另一个程序的按钮。我遇到问题的部分是识别按钮的句柄。这是我到目前为止的代码:

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改变以来。我已经测试了它(这就是为什么我有所有&#34; cout&#34;那里的代码);

问题:如何识别我在回调函数中寻找的窗口(可能还有我要查找的按钮)?请不要说spy ++导致每次打开程序时ID和Handle值都会改变

1 个答案:

答案 0 :(得分:1)

每次代码运行时,句柄始终将更改。 Windows动态分配句柄。你或其他任何人都无法做到这一点。如果它没有改变会更令人惊讶。

控件ID的变化并不是特别的阴谋。保持不变的唯一方法是在原始应用程序中进行硬编码,最有可能是通过使用资源文件。但是如果程序员在运行时动态生成控件,那么他们就没有理由需要使用相同的ID。只要他们在需要的时候在某种数据结构中跟踪该ID就可以了。

您可能能够找到按钮控件的另一个属性,如标题。但这肯定不能保证。许多程序会更改标题以反映当前状态。

应用程序开发人员没有义务让其他程序轻易搞乱不属于他们的内容。

您是否考虑过使用UI Automation以正确的方式执行此操作?