以编程方式单击按钮C#

时间:2017-01-31 15:30:09

标签: c# winforms reflection buttonclick findwindow

我正在寻找一种以编程方式单击按钮的方法(Winform)。我有一个表单(比如Form2)和我项目的按钮(Button2)。当我单击我的按钮时,它应该单击Button1(在另一个项目中),但两者都在同一个解决方案中。     这就是我试图做的事情:

private void button2(object sender, EventArgs e)
{

    System.IntPtr hwnd;

    System.IntPtr hwndChild = IntPtr.Zero;

    hwnd = FindWindow(null, "form1");

    if (hwnd.Equals(IntPtr.Zero))
    {
     MessageBox.Show("Couldn't find the form");
    }
    else
    {
    hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, null, "BUTTON1");

    if(!hwndChild.Equals(IntPtr.Zero))
    SendMessage(hwndChild, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
    }
}

我应该使用像反射这样的其他方法吗?

P.S:Button1是私有的,不能对该功能/项目进行任何更改

2 个答案:

答案 0 :(得分:3)

OP:

  

我正在寻找一种以编程方式单击按钮的方法(Winform)。

     

Button1和Button2分为两个不同的过程。我不应该对包含button1的代码进行任何更改。

当然,最简单的做法不需要对目标应用进行任何更改就是使用 Windows UI Automation 。 UIA本质上允许您从GUI角度自动化另一个应用程序(而不是通过COM / Ole Automation在幕后说),无论您是否只想要驱动另一个应用程序,例如单击按钮,或执行QA中的全面自动化测试。

MSDN:

  

Microsoft UI Automation是一个辅助功能框架,它使Windows应用程序能够提供和使用有关用户界面(UI)的编程信息。 more...

...和

  

UIA可用于自动化本机Windows应用程序,WPF应用程序以及Silverlight应用程序。 more...

此代码将在带有“目标演示”标题的窗口中单击包含文本“Click Me”的按钮。注意我不对任何特定的对象类型进行任何引用;回调或GUI技术(适用于本机; WinForms; WPF和Web)

//
// This is the handler in the ButtonClicker app, the app that is doing the clicking
//
private void go_Click(object sender, EventArgs e)
{
    // Look for a top-level window/application called "Target Demo"
    var root = AutomationElement.RootElement;
    var condition1 = new PropertyCondition(AutomationElement.NameProperty, "Target Demo");

    var treeWalker = new TreeWalker(condition1);
    AutomationElement element = treeWalker.GetFirstChild(root);

    if (element == null)
    {
        // not found
        return;
    }

    // great!  window found
    var window = element;

    // now look for a button with the text "Click Me"
    var buttonElement =window.FindFirst(TreeScope.Children, 
        new PropertyCondition(AutomationElement.NameProperty, "Click Me"));
    if (buttonElement == null)
    {
        // not found
        return;
    }

    // great! now click the button
    var invokePattern = buttonElement.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
    invokePattern?.Invoke();

}

优势

  • 定位应用所需的零更改
  • 找不到窗口句柄
  • 试图将BN_CLICK通知发送到某个应用的消息,并希望它可以正常工作
  • 适用于c ++应用;的WinForms; WPF;网络

答案 1 :(得分:-2)

你有几个选项,如下面

1- try/finally

2- button1.PerformClick();

3- button1_Click(this, EventArgs.Empty);