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 @ 2024-04-08 10:50  不是豆豆  阅读(46)  评论(0编辑  收藏  举报
友情链接:迷途