Possible Duplicate:
How to distinguish ‘Window close button clicked (X)’ vs. window.Close() in closing handler
在 WPF 中,以下是关闭 Window
的不同方法。 :
1) Window.Close()
2) 从窗口系统菜单(左上角)中选择“关闭”
3) 单击窗口标题栏(右上角)上的“X”按钮
4) 键盘快捷键:Alt+F4
所有这些操作都会触发 WPF 事件 Window.Closing
如何区分这两种类型的操作?
在 Excel/VBA 中这是可能的:VBA.VbQueryClose.vbFormCode
与 VBA.VbQueryClose.vbFormControlMenu
.
This related question/answer说系统菜单操作将生成Windows事件WM_CLOSE
。也许有一种方法可以从 WPF 查看底层 Windows 事件。
最佳答案
可以调用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;
}
And you have a list of all Windows messages
Values for wParam for WM_SYSCOMMND
希望这有帮助。
关于c# - WPF:如何区分 Window.Close() 调用和系统菜单关闭操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13854889/