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

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

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 06 октября 2008

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

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

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

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

        return createParams;
    }
}

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

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

2 голосов
/ 06 октября 2008

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

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

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

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

1 голос
/ 17 августа 2011

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

...