Я глобально (общесистемный) фильтрует определенные щелчки мыши с помощью SetWindowsHookEx
и WH_MOUSE_LL
. Проблема в том, что он не работает для приложений WPF (все приложения WPF обнаруживают щелчки мыши, не указала ли я системе игнорировать эти клики). Я уже задал здесь аналогичный вопрос, но я предположил, что WPF использует DirectInput
вместо стандартных сообщений Windows для обнаружения ввода. Но делает?
Я смог найти код, который смог вставлять клики мыши в приложения WPF с помощью SendMessage
. Если это возможно, то я думаю, что это как-то означает, что WPF не использует DirectInput
для ввода мыши. Но почему, почему не удается помешать приложениям WPF обнаруживать щелчки мыши с помощью SetWindowsHookEx
?
Хотя этот вопрос в основном касается ввода мыши, я также хотел бы знать, как он работает для ввода с клавиатуры.
Пример
Я быстро создал следующее решение для воспроизведения нечетного поведения WPF. Он состоит из 3-х проектов:
-
HookTester
StartUp, автоматически запускает другие 2 проекта, поэтому вы должны быть в основном обеспокоены этим. Устанавливает крючок мыши при запуске и удаляет крючок при закрытии формы. -
WinFormsTest
Содержит TextBox с контекстным меню по умолчанию, в котором вы можете проверить правую кнопку мыши. Когда HookTester запущен, вы не сможете вызвать контекстное меню с помощью правой кнопки мыши. -
WpfTest
Содержит также TextBox с настраиваемым контекстным меню (хотя я мог бы также использовать меню по умолчанию), так что это снова место для проверки правой кнопки мыши. Вы не должны вызывать контекстное меню (используя правую кнопку мыши), пока работает HookTester, но по какой-либо причине меню будет показано в любом случае (почему???).
ПРЕДУПРЕЖДЕНИЕ:. При запуске решения запускается проект HookTester и сразу же устанавливает крючок, чтобы отклонить любые щелчки мыши правой кнопкой мыши (общесистемные). Вы можете легко удалить крючок, просто закрыв форму HookTester. Протестируйте с осторожностью.