Как я могу симулировать события мыши из кода? - PullRequest
17 голосов
/ 02 марта 2011

Я хотел бы имитировать события мыши, используя Win32 API;как мне это сделать?

То, что я хочу сделать, - это смоделировать событие на самом базовом уровне, уровне, на котором система имеет только тип события и координаты, и еще не выяснила, в какое окно она должна передать его,

Я не знаю, так ли это работает.В любом случае, мне нужна помощь в этом.Должен ли я вмешиваться на уровне драйвера?!

Чтобы прояснить свои требования, я не хочу ориентироваться ни на одно окно, я просто хочу, чтобы система думала, что пользователь щелкнул мышью или переместил ее.И я буду кодировать в C.

Ответы [ 2 ]

24 голосов
/ 02 марта 2011

Вам нужна функция SendInput , которая позволяет синтезировать мышь движения и нажатия кнопок в вашем коде, указав массив INPUT структур , соответствующих входным событиям.

UINT WINAPI SendInput(
  __in  UINT nInputs,     // number of structures in the pInputs array
  __in  LPINPUT pInputs,  // an array of INPUT structures, representing an event
  __in  int cbSize        // the size, in bytes, of an INPUT structure
);

Обратите внимание, однако, что эта функция подлежит Изоляция привилегий интерфейса пользователя (UIPI) , что означает, что вашему приложению разрешено вводить данные только тем приложениям, которые работают с равным или меньшим уровнем целостности ,

6 голосов
/ 01 ноября 2011

Используйте mouse_event (winuser.h). Следующий код переместит мышь, затем выполнит щелчок в новом месте. Вы можете сделать это в две строки, но это более многословно.

Обратите внимание, что X и Y указаны в mickeys , от 0 до 65535. Это затем отображается на текущее разрешение, то есть 0,0 будет верхним левым углом, а 65535,65535 будет нижним правый угол.

mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x, y, 0, 0);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
...