C#WinForms应用程序中的应用程序范围的消息处理程序

时间:2013-12-05 21:08:07

标签: c# winforms delphi handler windows-messages

在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

此外,这两种解决方案仅适用于一个表单类,我需要一个应用程序范围的解决方案。

1 个答案:

答案 0 :(得分:2)

您可以使用Application.AddMessageFilter注册邮件过滤器。来自文档:

  

使用邮件过滤器来阻止特定事件发生   为之前的活动筹集或执行特殊操作   传递给事件处理程序。邮件过滤器对于a是唯一的   具体线程。

     

要阻止调度消息,必须传递给此方法的value参数实例   使用处理消息的代码覆盖PreFilterMessage方法。该方法必须返回false。

这提供了与Delphi的OnMessage事件完全相同的功能。