可能重复:
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事件。
答案 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
时,也可能会发生这种情况
如果您正在处理鼠标事件,请检查鼠标是否在哪个元素上。