gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:24:35 31 4
gpt4 key购买 nike

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.vbFormCodeVBA.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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com