如何捕捉'发送'在c#中使用UI自动化为Outlook设置按钮事件

本文关键字:自动化 Outlook 设置 UI 按钮 事件 发送 何捕捉 | 更新日期: 2023-09-27 18:18:08

我想使用UI自动化捕获outlook的'Send'按钮事件。现在我能够获得"焦点变化事件",就像每当我最小化或最大化WINWORD窗口时,事件被引发,而不是我想在发送按钮单击上获得事件。

  private void SendButtonInvoke()
    {
        Process[] processes = Process.GetProcessesByName("WINWORD");
        AutomationElement aeOutLook = null;
        foreach (var item in processes)
        {
            aeOutLook = AutomationElement.FromHandle(item.MainWindowHandle);
        }
        //AutomationElement outlookelm = AutomationElement.FromHandle(processName.MainWindowHandle);
        AutomationElement buttonAddInstance = aeOutLook.FindFirst(TreeScope.Descendants,
               new PropertyCondition(AutomationElement.NameProperty, "Send"));
        if (buttonAddInstance == null)
        {
            MessageBox.Show("Add button instance not found");
        }
        else
        {
            AutomationPropertyChangedEventHandler ButtonEvent =
                new AutomationPropertyChangedEventHandler(ButtonChecked_EventHandler);
            //Attaching the EventHandler
            Automation.AddAutomationPropertyChangedEventHandler(buttonAddInstance, TreeScope.Children,
                ButtonEvent, AutomationElement.NameProperty);
        }
    }

private void ButtonChecked_EventHandler(object sender, AutomationEventArgs e)
    {
        AutomationElement ar = sender as AutomationElement;
        MessageBox.Show("Button Clicked Sucessfully.");
    }

如何捕捉'发送'在c#中使用UI自动化为Outlook设置按钮事件

您必须为所涉及的UIA模式指定eventandler。(对于您的情况,它可能是InvokePattern):

Automation.AddAutomationEventHandler(InvokePattern.InvokedEvent, AutomationElement buttonAddInstance ,TreeScope.Element, new AutomationEventHandler(OnStartInvoke));
private static void OnStartInvoke(object src, AutomationEventArgs e)
{
    //logic
}

我编写并测试了下面的代码,它似乎适合我。

    private void AddEmailSendEvent()
    {
        // Find the new email window
        PropertyCondition newEmailWindowCondition = new PropertyCondition(AutomationElement.NameProperty, "Untitled - Message (HTML) ");
        AutomationElement NewEmailWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children, newEmailWindowCondition);
        // Find the Send Button
        PropertyCondition sendEmailButtonCondition = new PropertyCondition(AutomationElement.NameProperty, "Send");
        AutomationElement sendButton = NewEmailWindow.FindFirst(TreeScope.Descendants, sendEmailButtonCondition);
        // If supported, add the invoke event
        if (sendButton.GetSupportedPatterns().Any(p => p.Equals(InvokePattern.Pattern)))
            Automation.AddAutomationEventHandler(InvokePattern.InvokedEvent, sendButton, TreeScope.Element, handler);
    }
    private void handler(object sender, AutomationEventArgs e)
    {   
        // Do whatever is needed, for testing this just adds a message to my forms Main UI
        AddMessage("Invoke event occured");
    }

我应该注意到我正在使用。net 4.0自动化库。我发现旧的机器并不总是按我想要的方式工作。我还用Outlook 2013进行了测试,测试时Outlook和新邮件都已经打开。它无法处理等待它们出现的问题。

请注意,这些事件并不总是适用于所有控件。一些自定义控件是这样做的:调用事件不以事件可以注册的方式报告给UI。话虽如此,从我的测试来看,您应该能够在发送按钮上使用此方法。

调用与鼠标单击:为了添加更多细节,标准控件在用户单击它时触发调用事件。"Invoke"只是在可点击控件上触发的标准事件。点击不会触发相同调用的唯一情况是,开发人员决定以某种方式拦截点击并将其重定向到其他地方。当人们创建自己的自定义控件时,我经常看到这种情况。

如果你不确定一个控件是否使用/触发调用事件,你可以使用可访问事件观察器来观察你点击它的控件。您可以在这里获得有关该工具的更多信息:https://msdn.microsoft.com/en-us/library/windows/desktop/dd317979(v=vs.85).aspx