【问题标题】:Application-wide message handler in C# WinForms applicationC# WinForms 应用程序中的应用程序范围的消息处理程序
【发布时间】:2013-12-05 21:08:06
【问题描述】:

在 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

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

【问题讨论】:

  • 该信息需要在问题和标签中。 WPF 会有所不同。就像我说的那样,我认为它是适合你的 ProcessCmdKey。
  • @David Heffernan:如何使ProcessCmdKey 处理WM_KEYUP
  • @Paul - 看看this;尤其是 Hans Passant 的回答。
  • @Brian - 打败我。这是正确的答案。
  • 有人应该写一个答案

标签: c# winforms delphi handler windows-messages


【解决方案1】:

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

使用消息过滤器来阻止特定事件 为之前的事件引发或执行特殊操作 传递给事件处理程序。消息过滤器是唯一的 具体线程。

为防止消息被分派,您传递给此方法的值参数实例必须 使用处理消息的代码覆盖 PreFilterMessage 方法。该方法必须返回 false。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多