2013-12-05 2 views
2

В Delphi 6 я мог бы установить обработчик сообщений приложения широко:Применение в масштабе обработчика сообщений в приложении # WinForms C

procedure TFrmMain.TntFormShow(Sender: TObject); 
begin 
    Application.OnMessage:=AppMsgHandler; 
end; 

procedure TFrmMain.AppMsgHandler(var Msg:TMsg; var Handled:Boolean); 
begin 
    if Msg.message=WM_KEYDOWN then begin 
    .............. 
    end; 
    if Msg.message=WM_KEYUP then begin 
    .............. 
    end; 
end; 

Этот обработчик делает возможным обработку событий клавиатуры независимо, которые контролируют или даже в какой форме заявки активен. Обратите внимание, что это не глобальный системный крючок для всей системы, и поэтому он не так опасен.

Теперь вопрос: как может быть сделано то же самое в приложении C# WinForms?

Я мог бы переопределить WndProc формы, но это решение не ложится на события keydown и keyup.

Я мог бы также переопределить ProcessCmdKey формы, но не поймал WM_KEYUP.

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

+0

Эта информация должна быть в вопросе и тегах. WPF будет отличаться. Как я уже сказал, я думаю, что для вас это ProcessCmdKey. –

+0

@ Давид Хеффернан: как сделать обработчик 'ProcessCmdKey'' WM_KEYUP'? – Paul

+3

@Paul - взгляните на [это] (http://stackoverflow.com/questions/2434834/processcmdkey-wait-for-keyup); в частности, ответ от Hans Passant. – Brian

ответ

2

Чтобы зарегистрировать фильтр сообщений, вы можете использовать Application.AddMessageFilter. Из документации:

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

Чтобы предотвратить отправку сообщения, экземпляр параметра значения, который вы передаете этому методу, должен переопределить метод PreFilterMessage с кодом для обработки сообщения. Метод должен возвращать false.

Это та же функциональность, что и событие OnMessage от Delphi.