【发布时间】:2017-06-17 02:40:37
【问题描述】:
我正在寻找一种以编程方式单击按钮的方法(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 是私有的,不能对该函数/项目进行任何更改
【问题讨论】:
-
button2(null,null);工作吗? -
如果它在您的流程中,您应该调用您的业务逻辑,而不是通过您的 UI。如果是另一个进程,请使用 Microsoft UIA
-
@sjohnson - 告诉给你这项工作的人回到设计阶段然后走开
-
"如果按钮在对话框中并且对话框未激活,BM_CLICK消息可能会失败。为确保在这种情况下成功,请在发送之前调用SetActiveWindow函数激活对话框BM_CLICK 消息到按钮。”您是否检查过您是否拥有正确的 ID 以及是否在 Spy++ 中触发了正确的事件?
-
我会认真阅读设计模式以避免您在这里尝试做的事情。而不是在另一个项目中“单击”button2,您要做的是执行该按钮执行的操作。您应该将 UI 代码与业务逻辑分开。谷歌“MVC 设计模式”或“MVVM 设计模式”。任何一个都适用于您正在尝试做的事情。 Project1 中的控制器操作可以在 Project2 中的控制器上调用 Action 方法,而无需伪造按钮单击
标签: c# winforms reflection buttonclick findwindow