如何执行与在 Win32 中单击开始、电源图标和 "Shut down" 相同的操作

How to do the same as clicking Start, then the power icon, then "Shut down" in Win32

在 Windows 10 和 11(我不确定以前的版本)如果你点击 开始 ,然后是电源图标,然后 关机 Windows关机然后下次开机就可以了:

我正在尝试使用 Win32 api 执行此操作,但我不知道如何执行此操作。 ExitWindowsEx() 函数有一个快速启动选项,但没有选项让用户在下次启动时重新登录。 InitiateSystemShutdownEx() 功能更加有限。

我注意到命令 shutdown /sg 关闭然后在下次启动时自动登录最后一个用户,但它不支持快速启动(混合关闭)并且它会重新启动之前的所有应用程序 运行,不仅仅是启动文件夹中的应用程序。

我假设 启动、电源、关机 必须使用其他一些方法来关机 Windows。如果有人知道如何重现此内容,请告诉我。

快速启动和休眠

首先要注意hibernate和fast startup是不一样的。简而言之,快速启动是介于休眠和正常关机之间的某种混合状态。 this 文章中有更多相关信息。

进入电脑休眠使用SetSuspendStatewinapi.

EWX_HYBRID_SHUTDOWN传递给ExitWindowsEx即可实现快速启动。

应用程序重启

您可以使用 RegisterApplicationRestart 注册重启应用程序,然后按照 this 文章的建议将标志 EWX_RESTARTAPPS 传递给 ExitWindowsEx

自动登录

重启后登录当前用户有多种方式。例如使用注册表 - HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\AutomaticRestartSignOnConfig。有关它的更多信息以及可能更适合您的用例的其他选项,请参阅 this 文章。

如果其他人 运行 遇到此问题,解决方案是使用(未记录的)EWX_ARSO 标志和 ExitWindowsEx()

ExitWindowsEx() 的文档指出:

Syntax
BOOL ExitWindowsEx(
  [in] UINT  uFlags,
  [in] DWORD dwReason
);
Parameters
[in] uFlags

The shutdown type. This parameter must include one of the following values.

EWX_HYBRID_SHUTDOWN
0x00400000
Beginning with Windows 8:  You can prepare the system for a faster startup by combining the EWX_HYBRID_SHUTDOWN flag with the EWX_SHUTDOWN flag.
etc

它描述了确定 Windows 如何关闭的六个标志,但它没有提到 EWX_ARSO 标志,实际上谷歌搜索没有找到有用的信息。但是,该标志是在 winuser.h 中定义的,包含它的行为与在 Windows 中单击 开始、电源、关闭 完全相同。