C# 单击另一个应用程序中的按钮
我想让你使用C# 单击另一个应用程序中的按钮,c#,C#,我想让你使用SendMessage或PostMessage在另一个应用程序中按下按钮 我有一个通过获取窗口句柄来实现这一点的示例代码,但它不起作用 我还使用“WinDowse”获取所需信息。这是密码 private const uint BM_CLICK = 0x00F5; private const uint WM_LBUTTONDOWN = 0x0201; private const uint WM_LBUTTONUP = 0x0202; private void PushOKButton
SendMessage
或PostMessage
在另一个应用程序中按下按钮
我有一个通过获取窗口句柄来实现这一点的示例代码,但它不起作用
我还使用“WinDowse”获取所需信息。这是密码
private const uint BM_CLICK = 0x00F5;
private const uint WM_LBUTTONDOWN = 0x0201;
private const uint WM_LBUTTONUP = 0x0202;
private void PushOKButton(IntPtr ptrWindow)
{
WindowHandle = FindWindow(null, "Form1");
if (ptrWindow == IntPtr.Zero)
return;
IntPtr ptrOKButton = FindWindowEx(ptrWindow, IntPtr.Zero, "Button", "&Yes");
if (ptrOKButton == IntPtr.Zero)
return;
SendMessage(ptrOKButton, WM_LBUTTONDOWN, 0, 0);
SendMessage(ptrOKButton, WM_LBUTTONUP, 0, 0);
SendMessage(ptrOKButton, BM_CLICK, 0, 0);
}
在c#中有完整的答案吗?你的总体思路是正确的。 自动化总是有诀窍的 按钮向下/向上与单击的原始动作非常接近,但并不完全相同。 你会想考虑< /P>
也许您可以研究一下以节省一些时间。下面是一个使用win32 API驱动鼠标的示例-实际上用于拖放选择区域,但您可以在按钮内将坐标更改为鼠标下/上
POINT p;
BOOL cursorPosGetSuccessful = GetCursorPos(&p);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, horA, verA, NULL, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, NULL, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, horB, verB, NULL, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, NULL, 0);
if (cursorPosGetSuccessful)// put the mouse back to roughly where it used to be before the scan.
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, p.x, p.y, NULL, 0);
假设我有这些:鼠标坐标、窗口标题、窗口句柄、窗口类名,你能留下完整的代码吗?直接从:“此函数已被取代。请改用。”两者都不允许你控制特定的进程;输入总是转到前台进程。正如你的另一个答案所指出的(你为什么觉得有必要发布两个呢?):真正的答案是。谢谢你的更新。第二篇帖子是由于不同的可能答案。“你的总体想法是正确的。”-哦,不。这个想法是错误的。消息只是输入处理的可观察部分。如果您只重播该部分,您将以不一致的状态结束。真正的答案是,.NETUI自动化框架是有限的,并且会导致各种各样的人工制品,比如Adobe reader,如果你甚至从侧面看它显示的窗口,就会提示进入可访问性模式。由于目标应用程序中的错误,自定义控件创建没有适当地涵盖自动化支持,因此我们一直在使许多试图使用UI自动化的Microsoft应用程序崩溃。UI自动化通过COM对象公开,这些对象很容易从.NET使用,以防预构建库支持不足。你的评论表明你回答了一个不同的问题:“假设UI自动化对我们不起作用,还有什么替代方案?”OP从未声称UI自动化对他们不起作用,所以应该首先考虑。如果你需要伪造输入,你真的需要把它做好。发送消息不行(请参阅)。