Я пишу очень специализированное приложение на C#, которое отображается в виде прозрачного окна по всему рабочему столу. Я хочу иметь возможность создавать и передавать события мыши приложениям, стоящим за моим, и чтобы они работали «нормально», реагируя на эти события. Также было бы предпочтительнее, если бы оконный менеджер мог ответить.
Я не гуру Windows и не знаю, как лучше всего этого добиться.
С этой страницы: http://bytes.com/forum/thread270002.html
Казалось бы, mouse_event была бы хороша, за исключением того, что, поскольку мое приложение плавает поверх всего остального, я предполагаю, что мои сгенерированные события никогда не дойдут до других приложений ниже.
Кажется, альтернативой является SendMessage, но для этого требуется изрядное количество ручных манипуляций с окнами, а генерируемые события мыши не являются «подлинными».
Есть мысли о том, как лучше всего подойти к этому?
Я ищу для создания мероприятий.
Если вы хотите создавать события, то SendMessage настолько хорош, насколько это возможно. AFAIK, сообщения, отправленные с помощью SendMessage, неотличимы от обычных сообщений, если вы специально его не ищете.
Если кому-то интересно, результатом этого вопроса стала система, позволяющая вводить данные всем телом в Windows. Я создал события мыши на основе событий нажатия на Wii Remote. Вы можете увидеть это здесь: youtube.com/watch?v=7dLDVL7rtrI





Похоже, вы хотите сделать что-то вроде фильтрации пользовательского ввода.
Может быть, вам просто понадобится крючок для клавиатуры / мыши.
Возможно, вы захотите взглянуть на вызов Windows API SetWindowsHookEx.
Также должно быть достаточно примеров того, как это сделать на C#. Первое, что я нашел, это эта ссылка (возможно, не лучшая статья, но она должна дать вам представление).
Обратите внимание, что если вы используете хуки, они не будут работать в окнах администратора (Powershell, VS в Admin и т. д.) При работе в пользовательском режиме.
Посмотрев на системные перехватчики и другие низкоуровневые решения, я нашел гораздо более простой метод.
Во-первых, установите для формы одно и то же значение TransparencyKey и BackColor. Для меня это не имело никакого визуального значения, поскольку моя форма уже была визуально прозрачной, но это поможет пропустить события мыши.
Во-вторых, следующий код позволит событиям мыши «проваливаться» через вашу форму.
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
return createParams;
}
}
Наконец, установите TopMost равным true.
Ваша форма теперь будет плавать поверх всего визуально, но перестанет фокусироваться на всех других приложениях.
Вопрос в том, что вы хотите с ним делать - как быстрое одноразовое приложение это может работать хорошо, но если вы хотите использовать такую вещь на большем количестве ящиков, это может привести к большему количеству проблем - например, что, если существует другое самое верхнее окно.
Фионн: согласен. Другие самые верхние окна сломают это. Сколько у нас может быть самых популярных приложений. Однако это самый простой подход без необходимости переходить на низкий уровень.
Если вы отключите элемент управления и вернетесь, вы сможете передать событие MouseDown родителю.
Вы хотите / создавать / события или просто позволяете существующим щелчкам мыши проходить?