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

标签 c# .net wpf xaml

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/

相关文章:

c# - 包含函数和可选参数的字典

c# - 我想创建一个具有任意索引的 IEnumerable 继承稀疏数组

c# - 如何重载 C# 中的方括号运算符?

c# - 自定义组件在设计器中工作,但在代码中不可见

c# - 如何使用 wpf webbrowser 将数据发布到 Web 服务器

c# - 绑定(bind) View 模型属性在后台线程中更新; UI 会始终看到更新后的值吗?

c# - C#中两个结构的相等性

.net - 如何处理 ComboBox 选定的索引更改?

.net - 下载和设置 dbpedia 转储

带有两个边框的 WPF DPI 渲染问题