WPF:如何区分Window.Close()调用和系统菜单关闭操作?

时间:2012-12-13 07:18:25

标签: c# .net wpf xaml

  

可能重复:
  How to distinguish ‘Window close button clicked (X)’ vs. window.Close() in closing handler

在WPF中,以下是关闭Window的不同方法:

1)Window.Close()
2)从Window系统菜单中选择'Close'(左上)
3)单击窗口标题栏上的“X”按钮(右上角)
4)键盘快捷键:Alt + F4

所有这些操作都会触发WPF事件Window.Closing

如何区分这两种行为?

在Excel / VBA中,这可能是:VBA.VbQueryClose.vbFormCode vs VBA.VbQueryClose.vbFormControlMenu

This related question/answer表示系统菜单操作将生成Windows事件WM_CLOSE。也许有办法从WPF中看到底层的Windows事件。

3 个答案:

答案 0 :(得分:6)

您可以调用HwndSource.AddHook来处理Win32消息以获取Window的原因。 类似的东西:

Window myWindow = new Window();
myWindow .Loaded += delegate
{
    HwndSource source = (HwndSource)PresentationSource.FromDependencyObject(myWindow );
    source.AddHook(WindowProc);
};

WindowProc的实现:

    private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam,      
      ref bool handled){
     switch (msg)
     {
         case: 0x10:
              Console.WriteLine("Close reason: Clicking X");
         case 0x11:
         case 0x16:
             Console.WriteLine("Close reason: WindowsShutDown");
             break;

         case 0x112:
             if (((ushort)wParam & 0xfff0) == 0xf060)
                 Console.WriteLine("Close reason: User closing from menu");
             break;
     }
     return IntPtr.Zero;
    }

And you have a list of all Windows messages

Values for wParam for WM_SYSCOMMND

希望这有帮助。

答案 1 :(得分:3)

一个简单的选择是在自己调用Window.Close之前设置一些标志。

答案 2 :(得分:1)

当然,当您按Alt +F4时,也可能会发生这种情况 如果您正在处理鼠标事件,请检查鼠标是否在哪个元素上。