WPF 中处理系统关闭

2024-05-16

如何在 WPF 中重写 WndProc? 当我的窗口关闭时,我尝试检查我正在使用的文件是否被修改,如果是,我必须提示用户“你想保存更改吗?”消息,然后关闭正在使用的文件和窗口。但是,当我的窗口仍然打开时,我无法处理用户重新启动/关闭/注销的情况。我无法覆盖 WndProc,因为我正在使用 WPF 进行开发。我也尝试过使用这个示例 MSDN 代码 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b97a6de-0480-4339-8ed0-cb7cdb27bd83.这就是我所做的 私有无效loadForm(对象发送者,RoatedEventArgs e) {

  HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
  source.AddHook(new HwndSourceHook(WndProc));

}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{


 if (msg == WM_QUERYENDSESION.)
 {
  OnWindowClose(this, new CancelEventArgs())
  handled = true;
  shutdown = true;
 }  
 return IntPtr.Zero;    
}
private void OnWindowClose(object sender, CancelEvetArgs e)
{
   if (modified)
   {
     //show message box
     //if result is yes/no
       e.cancel = false;
     //if cancel
        e.cancel = true;
   }

}

在XAML文件上,我还使用了Closing = "OnWindowClose"但是,当我单击“是/否”时没有任何反应,我的应用程序不会关闭。如果我尝试使用关闭按钮再次关闭它,我会收到错误消息?为什么会这样呢?是因为胡克吗?? WPF 中与此等效的是什么?

private static int WM_QUERYENDSESSION = 0x11;
private static bool systemShutdown = false;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg==WM_QUERYENDSESSION)
    {
        systemShutdown = true;
    }

    // If this is WM_QUERYENDSESSION, the closing event should be
    // raised in the base WndProc.
    base.WndProc(m);

} //WndProc 

private void Form1_Closing(
    System.Object sender, 
    System.ComponentModel.CancelEventArgs e)
{
    if (systemShutdown)
        // Reset the variable because the user might cancel the 
        // shutdown.
    {
        systemShutdown = false;
        if (DialogResult.Yes==MessageBox.Show("My application", 
            "Do you want to save your work before logging off?", 
            MessageBoxButtons.YesNo))
        {
            SaveFile();
            e.Cancel = false;
        }
        else{
            e.Cancel = true;
        }
        CloseFile();
    }
}

为什么不使用应用程序.SessionEnding http://msdn.microsoft.com/en-us/library/system.windows.application.sessionending.aspx事件?这似乎是为了做你想做的事情而设计的,你不需要直接处理 Windows 消息。

如果想要取消关闭,可以将 SessionEndingCancelEventArgs 上的 Cancel 设置为 true。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 中处理系统关闭 的相关文章

  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • 以编程方式从 Generic.xaml 查找资源

    我正在尝试实施WPF 和 Silverlight 中的样式绑定 摘自本文 http www wintellect com cs blogs jprosise archive 2011 04 19 silverlight 5 s new st
  • 阻止用户取消选择列表框中的项目?

    我有一个列表框 里面有很多项目 用户可以单击某个项目来编辑其内容 如何防止用户取消选择所有项目 即 用户不应该无法选择任何内容 您的情况缺少一个案例 即清除列表后 您将选择列表中不再存在的项目 我通过添加额外的检查来解决这个问题 var l
  • 过滤绑定到 ItemsControl 的 ICollectionView

    我想制作一个 WPF 应用程序来浏览菜肴食谱 过滤数据时遇到问题 我正在使用 ItemsControl 使我的数据在窗口中看起来像 图块 现在我想用 TextBox 过滤它 但我不知道出了什么问题 这是我的 XAML 绑定
  • 如何在 XAML 和 C# 中将字符串列表显示为 DataGrid(表)

    我已经在 SO 上潜伏了很长时间 直到最近才决定建立一个帐户 我花了很多时间试图解决这个我一直没有询问的问题 但我就在这里 我正在努力实现的目标 我有一个字符串列表 例如 Mango Banana Melon 我们称之为水果 我想将其显示为
  • wpf 控件宽度绑定

    我有两个带有内容的边框 第二个边框宽度根据情况而变化 在内容上 我试图将第一个边框绑定到第二个边框宽度 但是 它不起作用 我不确定我错过了什么 有人可以给我一些指导吗 下面是我目前正在尝试的示例
  • WPF - 是否必须处置 HwndSource?

    我在用着HwndSource在非主窗口的 WPF 窗口中 为了挂钩窗口过程 WndProc 来接收一些消息 WinSource HwndSource FromHwnd new WindowInteropHelper this Handle
  • 基于动态资源的样式

    看来这样的事情是不允许的 有什么解决办法吗
  • WPF DataGrid 显示点而不是逗号

    在网上查找并寻找答案后没有结果 我想向您寻求帮助 我有一个包含 2 列的 SQL 数据库表 浮点数据类型 例如 1 2 1 3 1 4 等 绑定到一个DataGrid XAML 代码
  • 发送/捕获 SIGTERM 的 Win32 API 模拟

    在 POSIX OS 下 有信号 API 允许向进程发送信号以将其关闭 使用kill 您可以使用sigaction捕获它并执行您需要的操作 然而 Win32不是POSIX系统 所以 如何处理可能出现的关闭事件 例如来自 任务管理器 中的 结
  • 在WPF中如何添加菜单项事件?

    在我的 WPF 应用程序中 我添加一个菜单 然后在其下添加几个菜单项 例如 我的菜单项之一是 Main Item 然后我在 Main Item 下添加subItem1 subItem2和subItem3 我想单击 subItem1 并执行某
  • 无法在 WPF 中使用 MVVM 在设计时进行数据绑定 - ViewModel 属性永远不会被调用

    好吧 我正在为此烦恼 所以任何帮助将不胜感激 我正在使用 MVVM 模式构建 WPF 应用程序 为了在设计时获取数据 我将 Ninject 依赖注入框架与服务定位器结合使用 很像文章中的示例 http jonas follesoe no Y
  • 如何从用户控件引发自定义路由事件?

    在我的用户控件中 我有一个按钮 单击该按钮时会引发自定义路由事件 我试图引发它 但它没有在 MainWindow xaml 中被触发 UserControl 中按钮的 Xaml
  • 在 WPF 媒体元素中连续重播视频

    我有一个在媒体元素中播放的视频文件 我需要继续播放 因此我尝试了 me play me MediaEnded new RoutedEventHandler me MediaEnded 使用此事件方法 loop to keep video p
  • 如何知道 WPF 中的控件(或窗口)何时被渲染(绘制)?

    我需要将窗口的内容存储到图像中 保存并关闭窗口 如果我在 加载 事件上关闭窗口 则图像包含窗口 其中某些项目绘制正常 其他一些项目仅绘制了一半或扭曲 而其他项目则不在图像上 如果我设置一个计时器并在一定时间后关闭窗口 250 毫秒到 1 秒
  • 如何在不修改以前的文本的情况下更改 WPF RichTextBox 中的 FontFamily

    当您使用 RichTextBox 的 FontFamily 属性时 它会更改 FlowDocument 内整个内容的 FontFamily 就像执行 EditingCommands ToggleBold 这样的命令一样 它仅更改插入符号下的
  • ListView:在资源字典中定义ItemsPanelTemplate

    我有一个 ListView 其布局看起来像 Windows 资源管理器视图 图标 一些详细信息 绑定到 ViewModel 中某处的列表 我的目标是能够随时在资源管理器视图或经典视图之间切换 我可以定义一个ItemsPanelTemplat
  • 在c# wpf中从Memorystream获取Imagesource

    我怎样才能得到ImageSource from MemoryStream在 WPF 中使用 C 或转换MemoryStream to ImageSource将其显示为 wpf 中的图像 using MemoryStream memorySt
  • 带有移动向前/向后按钮的自定义列表框

    我有一个带有左 右重复按钮的自定义列表框 可以使用内容模板滚动其内容 如下所示

随机推荐