单击另一个应用程序中的按钮

时间:2010-06-09 20:14:16

标签: c#

我希望您使用SendMessagePostMessage按下其他应用中的按钮

我有一个示例代码,通过获取Window Handle来执行此操作,但它不起作用

我还使用“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#中有一个Compelete Suloution?

2 个答案:

答案 0 :(得分:0)

你有正确的总体思路。 总是有自动化的技巧。

按钮向下/向上是接近点击的原始动作的preatty,但不完全相同。 你会想要考虑

  1. 您点击的坐标 - 某些按钮不喜欢边缘点击0,0
  2. 鼠标的位置 - 开始或结束时按钮外的鼠标可能导致其无法正常工作
  3. 点击的时间 - 有时会忽略快速点击,添加一个小的延迟,例如10毫秒
  4. BM_Click是一个额外的win32消息,当鼠标点击一个按钮时发送 - 如果控件是单独使用它的正确类型,它是更短的方法,更容易。

    我们已经做了一些努力来防止在外国应用程序的密码编辑中使用WM_GetText之类的东西,但要小心,根据目标应用程序,您可能也会遇到问题。

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

    也许您可能会考虑AutoIT以节省一些时间。

答案 1 :(得分:-1)

以下是使用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);