Как передать события мыши приложениям позади меня в C # / Vista?
-
05-07-2019 - |
Вопрос
Я пишу очень специализированное приложение на C #, которое выглядит как прозрачное окно по всему рабочему столу. Я хочу иметь возможность создавать и передавать события мыши приложениям позади моего приложения, чтобы они работали «нормально», реагируя на эти события. Также было бы предпочтительно, если бы оконный менеджер мог ответить.
Я не гуру Windows и не знаю, как лучше всего это сделать.
С этой страницы: http://bytes.com/forum/thread270002.html
могло бы показаться, что mouse_event был бы хорош, за исключением того, что, поскольку мое приложение перемещается поверх всего остального, я предполагаю, что мои сгенерированные события никогда не дойдут до других приложений под ним.
Кажется, альтернативой является SendMessage, но для этого требуется значительное количество ручных манипуляций с окнами, и генерируемые события мыши не являются "подлинными".
Есть мысли о том, как лучше к этому подойти?
Решение 2
Посмотрев на системные хуки и другие низкоуровневые решения, я нашел гораздо более простой метод.
Во-первых, установите TransparencyKey и BackColor формы одинаковыми. Это не имело никакого визуального значения для меня, поскольку моя форма уже была визуально прозрачной, но это поможет пропустить события мыши.
Во-вторых, следующий код позволит событиям мыши "падать" через вашу форму.
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
return createParams;
}
}
Наконец, установите TopMost на true.
Ваша форма теперь будет отображаться поверх всего визуально, но перестанет фокусироваться на всех других приложениях.
Другие советы
Похоже, вы хотите сделать что-то вроде фильтрации пользовательского ввода.
Может быть, вам просто нужен крючок для клавиатуры / мыши.
Возможно, вы захотите взглянуть на вызов Windows API SetWindowsHookEx.
Также должно быть достаточно примеров, как это сделать в C #, первое, что я нашел, было эта ссылка (возможно, не самая лучшая статья, но она должна дать вам идею).
Если вы отключите элемент управления и вернетесь назад, вы сможете передать событие MouseDown родительскому элементу.