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

StackOverflow https://stackoverflow.com/questions/173579

Вопрос

Я пишу очень специализированное приложение на 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 родительскому элементу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top