当前位置: 首页 > 知识库问答 >
问题:

查找另一个程序的按钮

杭志泽
2023-03-14

我试图让我的程序单击另一个程序的按钮。我遇到的问题是识别按钮的手柄。这是我目前掌握的代码:

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都会发生变化...所以我不能使用间谍来获取一个ID来与自ID更改以来获得的ID进行比较。我甚至已经测试过了(这就是为什么我有所有的“cout”代码);

问题:然后如何在回调函数中识别我要查找的窗口(可能还有我要查找的按钮)??请不要说spy,因为每次打开程序时ID和句柄值都会更改

共有1个答案

党宇定
2023-03-14

每次代码运行时句柄总是会改变。Windows动态分配句柄。对此您或其他人无能为力。如果它不改变,那将更令人惊讶。

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

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

应用程序开发人员没有义务让另一个程序轻松地处理不属于他们的东西的内部。

您是否考虑过使用UI自动化的正确方法?

 类似资料:
  • 我需要一些帮助。我在最后写下了我的问题,并将首先解释我的代码到底应该做什么: 我正在制作一个与其他程序进行通信的程序。我需要我的软件能够点击另一个程序上的按钮,我相信这样做的合适代码是: 具有 但是,我不知道如何获取hWnd,它是同时运行的另一个程序的特定窗口上的特定按钮的句柄。我在某个地方读到,我可能会做以下事情: 哪里: 但是,我对FindWindowEX()函数有一些问题。 问题1:我看到的

  • 我想知道一个应用程序的包名,我只知道那个应用程序的应用程序名。假设我想知道一个电子邮件应用程序的包名,只是它的名字,然后如何得到它 我只知道应用程序名。 这是代码,以获得所有的应用程序的包名称,但我需要知道特定的应用程序。

  • 问题内容: 我有点麻烦。我有一项作业,要求我找出第二个圆圈是否重叠,内部是否重叠或两者都不存在。但是,我在检查重叠以及第二个圆是否在第一个圆内时遇到了麻烦。 (使用的变量为x1,x2,y1,y2,r1,r2,距离) 这是我所拥有的: 我担心问题在于重叠和内部检查,但是我无法弄清楚如何正确设置它,因此我可以可靠地检查第二个圆是否在第一个圆的内部。 当我尝试了多种方法时,任何帮助或建议都将不胜感激,但

  • 我知道有很多关于这个的话题,但是我找不到解决我的问题的方法。我知道如果我在hibernate中使用“不同”和“order by”,order by中的列必须在选择子句中。其他文章只是说该列必须在选择中,但是我还没有找到一个示例来实现这一点。 这是我的班级: 我的(不工作)查询: 例如,如果我按标题排序,它是有效的。我试图在select子句中设置学名: 但是然后hibernate抱怨查询的返回类型不

  • 问题内容: 我正在使用以下外壳程序脚本将一个文件的内容查找到另一个文件中: 我正在执行脚本,但未显示CSV文件中的内容。我的contents.txt文件还包含CSV文件中的数字,例如或。我的工作有什么问题吗? 问题答案: 本身能够做到。只需使用标志: 是每行包含一个模式的文件;并且是要在其中进行搜索的东西文件。 请注意,即使每行的内容看起来像一个正则表达式,也要强制将每行视为一个模式,您应该使用f

  • 我刚刚开始玩Java 8 lambda,我正在尝试实现一些我在函数式语言中习惯的东西。 例如,大多数函数语言都有某种对序列进行操作的find函数,或返回第一个元素的列表,该元素的谓词为。我能看到的在《Java八号》中实现这一点的唯一方法是: 然而,这似乎没有效率,因为过滤器将扫描整个列表,至少在我的理解(这可能是错误的)。有更好的办法吗?