我一直在尝试在程序中查找特定帮助按钮的句柄,然后向其发送BN_CLICK消息。为了调试,我查看了父窗口和按钮的句柄。
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", EntryPoint = "FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);
public Form1()
{
IntPtr hWndParent = FindWindow("WindowsForms10.Window.8.app.0.2c040a7_r9_ad1", null);
Debug.WriteLine(hWndParent,"n");
IntPtr button = FindWindowEx(hWndParent, IntPtr.Zero, "WindowsForms10.BUTTON.app.0.2c040a7_r9_ad1", "Help");
Debug.WriteLine(button);
}
调试返回 hWndParent 的数字,但按钮返回 0。我从Spy++获得了课程。 1
由于应用程序中有两个具有相同类的"帮助"按钮,这可能会变得复杂。这是我尝试使用帮助按钮获取句柄的应用程序窗口的图片,我想单击以红色框突出显示。2
我尝试添加通过AutoIT Info获得的实例编号。
IntPtr button = FindWindowEx(hWndParent, IntPtr.Zero, "WindowsForms10.BUTTON.app.0.2c040a7_r9_ad113", "Help");
这也返回了一个 0 for 按钮,将"帮助"替换为 null 也是如此。如果有人熟悉从Windows 10 Forms获取句柄并知道如何执行此操作,那么您的帮助将不胜感激。谢谢!
安德鲁
感谢汉斯的帖子 - 它为我指明了正确的方向。我已经使用Selenium和Appium来自动化点击/输入。对于将来偶然发现此问题以寻找解决方案的任何人,这里有一些代码可以提供帮助。
// You will need a few resources
using System;
using System.Windows.Forms;
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Remote;
// Making our driver
protected static WindowsDriver<WindowsElement> driver;
// I don't want to have to manually open WinAppDriver so..
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
pProcess.StartInfo.FileName = @"C:Program Files (x86)Windows Application DriverWinAppDriver.exe";
pProcess.StartInfo.Arguments = "olaa"; //argument
pProcess.StartInfo.UseShellExecute = false;
pProcess.StartInfo.RedirectStandardOutput = true;
pProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
pProcess.StartInfo.CreateNoWindow = true; //not diplay a windows
pProcess.Start();
string output = pProcess.StandardOutput.ReadToEnd(); //The output result
pProcess.WaitForExit();
// Now I connect to my app by setting up the driver
DesiredCapabilities caps = new DesiredCapabilities();
caps.SetCapability("platformName", "Windows");
caps.SetCapability("platformVersion", "10");
caps.SetCapability("deviceName", "WindowsPC");
caps.SetCapability("app", "C:\FileLocation.exe");
driver = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), caps);
// Commands can be sent as below
driver.FindElementByAccessibilityId("I'll explain this below").Click();
为了找到AccessibilityId,我发现最容易使用的工具是AutoIT窗口信息。 将查找器拖到所需的按钮上。然后在摘要选项卡中,您的辅助功能 ID 被简单地标记为"ID"。我选择了 AccessibilityId,因为我在想要控制的应用程序中有多个同名的按钮。
您需要安装 WinAppDriver 并将正确的位置放入代码中。Appium 和 Selenium 可以通过 Nuget 管理器添加,但我的代码中使用的一些函数已弃用。我刚刚使用了 Selenium.WebDriver 和 Selenium.Support 的 3.0.1 版本以及 Appium.WebDriver 的 3.0.0.1 版本(其他人可能工作,这些只是第一个工作(。