Как передать события мыши приложениям за моими в C# / Vista?

Я пишу очень специализированное приложение на C#, которое отображается в виде прозрачного окна по всему рабочему столу. Я хочу иметь возможность создавать и передавать события мыши приложениям, стоящим за моим, и чтобы они работали «нормально», реагируя на эти события. Также было бы предпочтительнее, если бы оконный менеджер мог ответить.

Я не гуру Windows и не знаю, как лучше всего этого добиться.

С этой страницы: http://bytes.com/forum/thread270002.html

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

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

Есть мысли о том, как лучше всего подойти к этому?

Вы хотите / создавать / события или просто позволяете существующим щелчкам мыши проходить?

Alex Lyman 06.10.2008 12:32

Я ищу для создания мероприятий.

Garth 06.10.2008 12:33

Если вы хотите создавать события, то SendMessage настолько хорош, насколько это возможно. AFAIK, сообщения, отправленные с помощью SendMessage, неотличимы от обычных сообщений, если вы специально его не ищете.

Matthew Scharley 06.10.2008 12:37

Если кому-то интересно, результатом этого вопроса стала система, позволяющая вводить данные всем телом в Windows. Я создал события мыши на основе событий нажатия на Wii Remote. Вы можете увидеть это здесь: youtube.com/watch?v=7dLDVL7rtrI

Garth 29.03.2011 01:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
4 469
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Похоже, вы хотите сделать что-то вроде фильтрации пользовательского ввода.

Может быть, вам просто понадобится крючок для клавиатуры / мыши.

Возможно, вы захотите взглянуть на вызов Windows API SetWindowsHookEx.

Также должно быть достаточно примеров того, как это сделать на C#. Первое, что я нашел, это эта ссылка (возможно, не лучшая статья, но она должна дать вам представление).

Обратите внимание, что если вы используете хуки, они не будут работать в окнах администратора (Powershell, VS в Admin и т. д.) При работе в пользовательском режиме.

Rick Strahl 24.11.2016 04:29
Ответ принят как подходящий

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

Во-первых, установите для формы одно и то же значение TransparencyKey и BackColor. Для меня это не имело никакого визуального значения, поскольку моя форма уже была визуально прозрачной, но это поможет пропустить события мыши.

Во-вторых, следующий код позволит событиям мыши «проваливаться» через вашу форму.

protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
    }
}

Наконец, установите TopMost равным true.

Ваша форма теперь будет плавать поверх всего визуально, но перестанет фокусироваться на всех других приложениях.

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

Fionn 06.10.2008 19:21

Фионн: согласен. Другие самые верхние окна сломают это. Сколько у нас может быть самых популярных приложений. Однако это самый простой подход без необходимости переходить на низкий уровень.

Garth 04.01.2012 04:26

Если вы отключите элемент управления и вернетесь, вы сможете передать событие MouseDown родителю.

Другие вопросы по теме