【问题标题】:Finding BUTTON of another program寻找另一个程序的按钮
【发布时间】:2014-04-22 05:21:05
【问题描述】:

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

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 值都会发生变化

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    句柄总是会在每次代码运行时发生变化。 Windows 动态分配句柄。你或其他人对此无能为力。如果它没有改变,那就更令人惊讶了。

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

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

    应用程序开发人员没有义务让其他程序很容易弄乱不属于他们的东西的内部结构。

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

    【讨论】:

    • 老兄,我喜欢你的评论,太棒了。不,我没有考虑过它,因为我还不知道它是什么,但我现在会阅读它,看看它是什么。任何关于 UI 自动化的技巧都会很棒。
    • UI 自动化上有趣的东西,似乎是一个函数库,可以帮助我完成这些过程。这是一个不错的选择,但是我认为我将首先尝试使用我之前所述的函数以及 windows.h 和其他常用库中的任何其他内容来解决问题......但这只是因为我花了很多时间尝试并且不想宣布失败
    • 立即使用 UIAutomation。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多