我正在寻找一种以编程方式单击按钮的方法(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是私有的,不能对该功能/项目进行任何更改
答案 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();
}
答案 1 :(得分:-2)
你有几个选项,如下面
1- try/finally
2- button1.PerformClick();
3- button1_Click(this, EventArgs.Empty);