C# - 寻找 Winform 应用程序的坐标

3
我有一个简单的登录窗口应用程序,现在我通过适配器控制该应用程序。我想找到文本框和按钮的坐标,我尝试使用右键单击文本框控件并从其属性中选择位置后的坐标,但没有成功。因此,我希望找到正确的位置,因为Windows窗体应用程序在运行时可以更改大小。那么,如何找到Windows表单坐标。
我已经尝试使用提供的文本框和按钮控件属性中的坐标,但这些坐标不起作用。
IntPtr childHwnd = Win32API.FindWindowByPosition(ptr, new Point(intFirstNameCoordX,intFirstNameCoordY));

这是我想要找到窗口的方法。

我想要在Windows表单中找到文本框和按钮的位置。我正在搜索并发现了一些Spy++工具,但我不确定那是否是我需要的,如果是的话,可以有人请指导我如何在简单的窗体应用程序中使用它来找到位置。


1
你具体是在寻找什么?是某些控件的(绝对)屏幕坐标,还是相对于它们所属窗口的控件的相对坐标? - user2819245
如果您有一个需要以某种方式检查另一个应用程序的应用程序,UI Automation 是一个不错的选择,我个人认为。您可以在窗口打开时(任何窗口)收到通知,并解析后代树以获取其任何子控件的信息。此外,如果需要,您还可以对这些控件执行操作。 - Jimi
@elgonzo 我想要绝对坐标,即使我改变桌面应用程序的大小,坐标也应保持固定。这意味着坐标不依赖于桌面应用程序的大小,因此它们将桌面应用程序屏幕视为实际屏幕,然后给出我们不依赖于屏幕大小的固定x和y坐标。 - Faran Saleem
好的,我看到了你的另一个问题:Win32API - 通过适配器点击Winform应用程序中的按钮。您只需要激活按钮的默认操作。UI自动化是我首选的工具。您只需要找到带有一些描述(例如文本)的子按钮控件,并在按钮上使用“InvokePatter”,这将导致按钮的默认操作,即单击事件。 - Jimi
但是,您描述了一个登录窗口。具体登录到什么地方? - Jimi
显示剩余4条评论
1个回答

3

好的,我可以看到你正在使用WinApi函数,所以我不会深入讨论它,只是给你一些想法。

首先,您可以获取主窗口句柄。您可以通过进程(列举进程窗口)或标题来获取句柄。如果您要通过标题获取句柄,可以使用FindWindow

此句柄是窗口句柄。接下来,您可以枚举其子窗口-例如面板或其他控件,使用 EnumChildWindows

现在其余部分取决于您的GUI架构。您的面板中可能有编辑和按钮,因此您必须搜索该面板的子窗口。您可能只是将控件放在主窗口上-因此您只需搜索该窗口的子控件。

接下来,当您找到感兴趣的控件时,您可以使用例如GetWindowRect获取更多信息。


那么您的意思是我不应该通过位置而是通过句柄来查找窗口?如果是的话,那么我在哪里可以找到句柄名称呢? 我对此非常陌生,所以提前道歉。 - Faran Saleem
所以我给你提供了这些函数 :) FindWindow - 你可以找到你的主应用程序窗口。然后你需要使用EnumChildWindows来查找它的子窗口。所有东西都是一个窗口 - 窗口、面板、按钮、文本框... FindWindow将为您获取主窗口的句柄。EnumChildWindows将为您获取子窗口的句柄和其他一些信息。 - Adam Jachocki
好的,我明白了,但是我如何获取窗口的句柄呢?我需要使用一些工具吗?比如一些树形可视化工具之类的东西?我知道父句柄、子句柄等等。 - Faran Saleem
不,每次创建控件时句柄都是不同的。您可以从FindWindow和EnumChildWindows获取句柄。请阅读我帖子中的链接 :) - Adam Jachocki
目前在我的代码中,我是这样查找MainWindowHandle的:IntPtr ptr = MainWindowHandle; - Faran Saleem
好的,所以你现在有主窗口的句柄。那么现在使用EnumChildWindows。 - Adam Jachocki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接