Имитация нажатия кнопки мыши в Windows - PullRequest
2 голосов
/ 16 ноября 2009

Я пишу клон удаленного рабочего стола на C ++, используя QT. До сих пор я могу нормально перемещать курсор мыши. В QT есть хорошая функция setPos для этого. Тем не менее, я немного растерялся относительно того, какой API / библиотеку использовать для имитации нажатий кнопок мыши.

Один из известных мне способов - это отправить WM_ (событие) в окно, используя HWND окна. Тем не менее, я надеялся, что есть более очевидный способ получить полный контроль над мышью. Есть ли другой способ сообщить операционной системе, что нажата левая кнопка мыши?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 13 марта 2011

Объединяя все вместе, вот код для Qt:

#include <windows.h>
QApplication::desktop()->cursor().setPos(globalX,globalY);
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 1, 1, 0, 0);
3 голосов
/ 09 июня 2010

Решение Лукаса Шалкаускаса работало для меня уже довольно давно, но сегодня оно неожиданно привело к следующей ошибке (возможно, из-за какого-то обновления .NET Центром обновления Windows?)

вызов функции PInvoke «SampleMethod» нарушил баланс стек. Это вероятно потому, что управляемая подпись PInvoke не соответствовать неуправляемой целевой подписи. Проверьте, что соглашение о вызовах и параметры подписи PInvoke соответствовать целевой неуправляемой подписи.

Итак, я переключился на пример кода pinvoke.net , и теперь он работает хорошо:

[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

[Flags]
public enum MouseEventFlags
{
    LEFTDOWN = 0x00000002,
    LEFTUP = 0x00000004,
    MIDDLEDOWN = 0x00000020,
    MIDDLEUP = 0x00000040,
    MOVE = 0x00000001,
    ABSOLUTE = 0x00008000,
    RIGHTDOWN = 0x00000008,
    RIGHTUP = 0x00000010
}

public static void LeftClick(int x, int y)
{
    Cursor.Position = new System.Drawing.Point(x, y);
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}
2 голосов
/ 16 ноября 2009

Это на C #, но может помочь вам понять:

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
   public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

   private const int MOUSEEVENTF_LEFTDOWN = 0x02;
   private const int MOUSEEVENTF_LEFTUP = 0x04;
   private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
   private const int MOUSEEVENTF_RIGHTUP = 0x10;

   public void DoMouseClick()
   {
      int X = Cursor.Position.X;
      int Y = Cursor.Position.Y;
      mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
   }

Ресурсы, которые могут помочь:

http://msdn.microsoft.com/en-us/library/ms646260%28VS.85%29.aspx

http://www.codeguru.com/Cpp/W-P/win32/article.php/c4543/

...