Как я могу имитировать события мыши из кода?

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

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

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

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


person Dharma    schedule 02.03.2011    source источник


Ответы (2)


Вы ищете функцию 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), что означает, что вашему приложению разрешено вводить входные данные только в приложения, работающие с таким же или меньшим уровнем целостности.

person Cody Gray    schedule 02.03.2011
comment
спасибо за упоминание о том, что integrity level, дающий моему приложению права администратора, решил эту проблему для меня :) - person Micka; 23.09.2014

Используйте 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);
person Chris    schedule 01.11.2011
comment
Согласно документам MSDN, mouse_event был заменен SendInput. Вместо этого они рекомендуют использовать SendInput. - person Winter Dragoness; 23.09.2014
comment
Функция mouse_event, похоже, не работает в Windows 10, хотя метод Коди SendInput работает. - person jrh; 26.01.2019