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>
  • 单击的坐标-某些按钮不喜欢在0,0处单击边
  • 鼠标的位置-鼠标在按钮开始或结束处的外侧可能导致其无法工作
  • 点击时间-有时一次快速点击被忽略,加上10毫秒的延迟
  • BM_Click是一个额外的win32消息,在鼠标单击按钮时发送-如果控件是单独使用的正确类型,那么它是一个较短的方法,也更容易

    为了防止在国外应用程序的密码编辑中使用WM_GetText之类的东西,我们做了一些努力。请注意,根据目标应用程序的不同,您可能也会遇到问题

    不幸的是,我现在没有给你的C#示例代码


    也许您可以研究一下以节省一些时间。

    下面是一个使用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自动化对他们不起作用,所以应该首先考虑。如果你需要伪造输入,你真的需要把它做好。发送消息不行(请参阅)。