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



在Delphi6中,我可以设置一个应用程序范围的消息处理程序:

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

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

您可以使用Application.AddMessageFilter注册消息筛选器。来自文件:

使用消息筛选器防止特定事件提出或为之前的事件执行特殊操作传递给事件处理程序。消息筛选器对于特定线程。

为了防止消息被调度,传递给此方法的值参数实例必须使用处理消息的代码重写PreFilterMessage方法。该方法必须返回false。

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

最新更新