Мышь крючок с C # - PullRequest
       44

Мышь крючок с C #

1 голос
/ 14 ноября 2010

Я пытаюсь эмулировать «аппаратные» щелчки мыши, поскольку кажется, что некоторые программные блоки блокируют ввод, например, из PostMessage.Я знаю, что есть SendInput, но это не вариант, так как мне нужно, чтобы это было совместимо и в фоновых окнах.Решением кажется низкоуровневая ловушка мыши, но я искал вокруг и не смог найти ничего, кроме только логгеров, никаких манипуляций с движением мыши, щелчком мыши и т. Д. Я бы хотел, чтобы это произошло без необходимости писать что-тосвоего рода оболочка C ++ / C для использования в качестве фальшивого драйвера мыши.

http://support.microsoft.com/kb/318804, Я обнаружил это, но, похоже, это не поможет.

Любая помощьоценил:)

Ответы [ 4 ]

2 голосов
/ 14 ноября 2010

Не уверен, что «какое-то программное обеспечение» может быть, но уверен, что UAC мешает вам вставлять сообщения в окна повышенных программ. Он называется UIPI, изоляция привилегий пользовательского интерфейса.

Как правило, фальсификация ввода с помощью PostMessage не работает вообще. Это особенно проблематично при вводе с клавиатуры, но при вводе с клавиатуры возникают проблемы. Нет хорошего способа изменить состояние клавиатуры для другого процесса. Это имеет значение, когда программа проверяет состояние клавиш Shift, Ctrl и Alt при обработке входного сообщения. Многие делают.

Единственное реальное решение - эмулировать ввод с помощью SendInput (). Теперь у вас есть проблема с фокусом для решения.

1 голос
/ 06 октября 2011

Взгляните на эту библиотеку http://globalmousekeyhook.codeplex.com/. Это 100% управляемый код C # для установки глобальных перехватов мыши и клавиатуры.

1 голос
/ 14 ноября 2010

mouse_event или SendInput используется для инъекции мыши.Но так же, как настоящая мышь, это глобальный ввод и не может работать на скрытых окнах.

Низкоуровневый крючок мыши тоже глобален, но он используется для перехвата и манипулирования вводом с мыши, а не длявводить ввод.

При нацеливании на конкретное окно вам нужно будет использовать SendMessage, но, как вы заметили, это не работает для всего.

Вы также можете использовать перехват DLL (дляНапример, ловушка IAT) для перехвата вызовов API, которые возвращают позицию курсора или состояние кнопок мыши.Но для этого вам нужно вставить DLL в целевое приложение, и эта библиотека не должна использовать .net.

0 голосов
/ 15 ноября 2010

Когда мне нужно смоделировать ввод с помощью мыши, я сначала пытаюсь использовать SendMessage, но иногда какой-то элемент управления или приложение могут получить сообщение.В этих ситуациях я использую spy ++ для перехвата сообщений окна, содержащего элемент управления, я делаю именно то, что хочу имитировать, а затем просто использую:

GetWindowLong (hwnd, GWL_WNDPROC);

чтобы получить процедуру окна, а затем вызвать метод wnd напрямую с помощью:

CallWindowProc (WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

отправка именно тех сообщений, которые я виделиспользуя Spy ++.Это всегда работает, потому что окно proc вызывается немедленно, а не помещается в очередь в цикле сообщений.

...