繁体   English   中英

C# 自动化点击按钮 Windows 10 计算器

[英]C# Automation Click Button On Windows 10 Calculator

所以我是 C# 的新手,我想做一个自动化,点击 Win10 计算器上的几个按钮

Auto.getWindow({
  "className": "ApplicationFrameWindow",
  "title": "Calculator"
}).getWindow({
  "className": "Windows.UI.Core.CoreWindow",
  "title": "Calculator"
}).getGeneric({
  "type": "Group",
  "automationId": "NumberPad",
  "name": "Number pad",
  "className": "NamedContainerAutomationPeer"
}).getButton({
  "automationId": "num5Button",
  "name": "Five",
  "className": "Button"
}).click(52, 24);

我像这样转移了getWindow并且有效

int hwnd=0;
IntPtr hwndChild=IntPtr.Zero;
IntPtr hwndChild2 = IntPtr.Zero;

//Get a handle for the Calculator Application main window
hwnd = FindWindow("ApplicationFrameWindow", "Calculator");
hwndChild = FindWindowEx((IntPtr)hwnd,IntPtr.Zero, "Windows.UI.Core.CoreWindow", "Calculator");             

但现在我需要点击按钮,我被卡住了。 我知道点击的最终结果是

SendMessage((int)hwndChild2, BM_CLICK, 0, IntPtr.Zero);

但我错过了到达按钮 position 的部分。 我不想使用 SendKeys。 谢谢你,如果我错过了什么或不清楚的话,我很抱歉。

如上所述,这可以通过 UIAutomation 来完成。 例如像这样:

public static AutomationElement calcUI;

public void FindAndClickButton(string name)
{
    System.Windows.Automation.Condition condition1 = new PropertyCondition(AutomationElement.ClassNameProperty, "Button");
    System.Windows.Automation.Condition condition2 = new PropertyCondition(AutomationElement.NameProperty, name);
    System.Windows.Automation.Condition condition = new AndCondition(condition1, condition2);
    AutomationElement button = calcUI.FindFirst(TreeScope.Descendants, condition);
    InvokePattern btnPattern = button.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
    btnPattern.Invoke();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    var calc = System.Diagnostics.Process.Start("calc");
    //wait for the UI to appear
    calc.WaitForInputIdle(5000);
    System.Threading.Thread.Sleep(2000);

    AutomationElement root = AutomationElement.RootElement;
    System.Windows.Automation.Condition condition = new PropertyCondition(AutomationElement.NameProperty, "Calculator");

    calcUI = root.FindFirst(TreeScope.Children, condition);
    if (calcUI != null)
    {
        // get and click the buttons for the calculation
        FindAndClickButton("Five");
        FindAndClickButton("Plus");
        FindAndClickButton("Nine");
        FindAndClickButton("Multiply by");
        FindAndClickButton("Three");
        FindAndClickButton("Divide by");
        FindAndClickButton("Four");
        FindAndClickButton("Equals");
        //get the result
        System.Windows.Automation.Condition conditionResult = new PropertyCondition(AutomationElement.AutomationIdProperty, "CalculatorResults");
        var result = calcUI.FindFirst(TreeScope.Descendants, conditionResult);
        MessageBox.Show(result.Current.Name);
    }
}

不要忘记添加对项目的引用

UIAutomationClient
UIAutomationTypes

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM