在Delphi 6中,我可以设置一个应用程序范围的消息处理程序:
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 :(得分:2)
您可以使用Application.AddMessageFilter注册邮件过滤器。来自文档:
使用邮件过滤器来阻止特定事件发生 为之前的活动筹集或执行特殊操作 传递给事件处理程序。邮件过滤器对于a是唯一的 具体线程。
要阻止调度消息,必须传递给此方法的value参数实例 使用处理消息的代码覆盖PreFilterMessage方法。该方法必须返回false。
这提供了与Delphi的OnMessage事件完全相同的功能。