Windows 系统下,软件在运行时通知阻止关机

官方相关文档:https://learn.microsoft.com/zh-cn/windows/win32/shutdown/shutdown-changes-for-windows-vista

https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-setprocessshutdownparameters

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-shutdownblockreasoncreate

首先引入 Vanara.User32 的 Nuget 包,提供 Windows API 调用(也可自行根据方法签名进行声明调用)

以 WPF 程序为例,首先在程序运行时,需要将本程序在关机时关闭的优先级提到最高()

public MainWindow()
{
	InitializeComponent();

	// 首先设置为系统最优先关闭的程序,第一时间拦截系统会话结束事件(注销&关机)
	// 避免在关机过程中,其它程序已关闭,就剩下自己这个程序未关闭,以此产生的依赖问题
	Kernel32.SetProcessShutdownParameters(0x4FF, 0);

	// 监听会话结束事件,进行阻止(注销&关机)
	App.Current.SessionEnding += (s, e) =>
	{
		// 中止程序关闭
		e.Cancel = true;

		// 阻止关机并说明原因(用户仍可通过“仍要关闭”继续)
		User32.ShutdownBlockReasonCreate(new WindowInteropHelper(this).Handle, "你还有事情没完成,不要关机啊~~~");

		// 尝试取消关机,但貌似没什么用
		Process.Start("shutdown", "/a");
	};
}

Vanara 参考:https://github.com/dahall/Vanara

posted @   不是豆豆  阅读(264)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2020-04-08 使用 docker 时遇到 no space left on device 问题的解决
2020-04-08 EF 数据库迁移
2013-04-08 ASP.NET WebForm的一些小问题
友情链接:迷途


点击右上角即可分享
微信分享提示