4

可能重复:
如何在关闭处理程序中区分“单击的窗口关闭按钮 (X)”与 window.Close()

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

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

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

如何区分这两种类型的操作?

在 Excel/VBA 中,这是可能的:VBA.VbQueryClose.vbFormCodeVBA.VbQueryClose.vbFormControlMenu.

这个相关的问题/答案说系统菜单操作将生成 Windows 事件WM_CLOSE。也许有一种方法可以从 WPF 中查看底层 Windows 事件。

4

3 回答 3

6

您可以调用 HwndSource.AddHook 来处理 Win32 消息以获取关闭窗口的原因。就像是:

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;
    }

你有一个所有 Windows 消息的列表

WM_SYSCOMMND 的 wParam 值

希望这可以帮助。

于 2012-12-13T08:14:32.073 回答
4

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

于 2012-12-13T07:28:59.633 回答
1

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

于 2012-12-13T07:35:40.433 回答