处理发送到 C# 托盘应用的消息WM_CLOSE

本文关键字:消息 WM CLOSE 应用 处理 | 更新日期: 2023-09-27 18:28:36

我找到了几篇文章告诉我如何使用WM_CLOSE消息,但我的应用程序是必须处理WM_CLOSE消息的人。

有没有办法连接WM_CLOSE并处理它?因为WM_CLOSE只关闭托盘图标,但不会终止进程本身......

问候

处理发送到 C# 托盘应用的消息WM_CLOSE

为此,

您需要覆盖Form上的WndProc方法,该方法是主托盘图标和句柄WM_CLOSE

private const int WM_CLOSE = 0x0010;
protected override void WndProc(ref Message m) {
  if (m.Msg == WM_CLOSE) {
    // Close everything
  }
  base.WndProc(ref m);
}

我们可以通过向Application添加MessageFilter来处理WM_CLOSE消息:

private class CloseMessageFilter : IMessageFilter
{
    const int WM_CLOSE = 0x0010;
    
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_CLOSE)
            Application.Exit();
        return false;
    }
}
static void Main()
{
    // ...
    Application.AddMessageFilter(new CloseMessageFilter());
    Application.Run();
}

仅在 .NET 6 下测试。