Delphi WinAPI ExitWindowsEx - 注销交互式用户、关闭系统或关闭并重启系统。 它将 WM_QUERYENDSESSION 消息发送到所有应用程序,以确定它们是否可以终止。

Delphi WinAPI ExitWindowsEx - 注销交互式用户、关闭系统或关闭并重启系统。它将 WM_QUERYENDSESSION 消息发送到所有应用程序,以确定它们是否可以终止。

语法:

BOOL ExitWindowsEx(
  [in] UINT  uFlags,  //关闭类型。
  [in] DWORD dwReason  //启动关闭的原因
);

参数:

  • [in] uFlags //关闭类型。 此参数必须包含以下值之一:
    • EWX_HYBRID_SHUTDOWN //从Windows 8开始:通过将EWX_HYBRID_SHUTDOWN标志与EWX_SHUTDOWN标志相结合,为更快的启动准备系统。
    • EWX_LOGOFF //关闭在调用 ExitWindowsEx 函数的进程登录会话中运行的所有进程。 然后,它会将用户注销。此标志只能由在交互式用户的登录会话中运行的进程使用。
    • EWX_POWEROFF //关闭系统并关闭电源。 系统必须支持关闭电源功能。调用进程必须具有SE_SHUTDOWN_NAME特权。 有关更多信息,请参见下面的“备注”部分。
    • EWX_REBOOT //关闭系统,然后重启系统。调用进程必须具有SE_SHUTDOWN_NAME特权。 有关更多信息,请参见下面的“备注”部分。
    • EWX_RESTARTAPPS //关闭系统,然后重新启动它,以及使用 RegisterApplicationRestart 函数注册重启的任何应用程序。 这些应用程序接收 WM_QUERYENDSESSION 消息, lParam 设置为ENDSESSION_CLOSEAPP值。 有关详细信息,请参阅 应用程序指南。
    • EWX_SHUTDOWN //将系统关闭到安全关闭电源的某个点。 所有文件缓冲区都已刷新到磁盘,并且所有正在运行的进程都已停止。调用进程必须具有SE_SHUTDOWN_NAME特权。 有关更多信息,请参见下面的“备注”部分。即使系统支持关闭电源功能,指定此标志也不会关闭电源。 必须指定EWX_POWEROFF才能执行此操作。具有 SP1 的 Windows XP: 如果系统支持关闭电源功能,则指定此标志会关闭电源。
    • 此参数可以选择包括以下值之一:
    • EWX_FORCE //如果启用终端服务,则此标志不起作用。 否则,系统不会发送 WM_QUERYENDSESSION 消息。 这可能会导致应用程序丢失数据。 因此,应仅在紧急情况下使用此标志。
    • EWX_FORCEIFHUNG //强制进程在超时间隔内不响应 WM_QUERYENDSESSION 或 WM_ENDSESSION 消息时终止。 有关详细信息,请参阅“备注”部分。
  • [in] dwReason //启动关闭的原因。 此参数必须是 系统关闭原因代码之一。
    • 如果此参数为零,则不会设置SHTDN_REASON_FLAG_PLANNED原因代码,因此默认操作是未定义的关闭,记录为“找不到此原因的标题”。 默认情况下,它也是计划外关闭。 根据系统的配置方式,计划外关闭会触发创建包含系统状态信息的文件,这可能会延迟关闭。 因此,不要对此参数使用零。

返回值

如果该函数成功,则返回值为非零值。 由于函数异步执行,因此非零返回值指示已启动关闭。 它不指示关闭是否成功。 系统、用户或其他应用程序可能会中止关闭。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

注解

ExitWindowsEx 函数在启动关闭过程后立即返回。 然后,关闭或注销会异步进行。 该函数旨在停止调用方登录会话中的所有进程。 因此,如果你不是交互式用户,则函数可以成功,而无需实际关闭计算机。 如果你不是交互式用户,请使用 InitiateSystemShutdown 或 InitiateSystemShutdownEx 函数。
非零返回值并不意味着注销是还是会成功。 关闭是一个异步进程,在 API 调用返回或根本不返回之后,它可能会发生。 即使超时值为零,关闭仍可由应用程序、服务甚至系统中止。 非零返回值指示权限和参数的验证成功,并且系统接受了关闭请求。
调用此函数时,调用方必须指定是否应强行关闭具有未保存更改的应用程序。 如果调用方选择不强制关闭这些应用程序,且未保存的更改的应用程序在控制台会话上运行,则关闭将继续进行,直到用户登录到控制台会话中止关闭、保存更改、关闭应用程序或强制应用程序关闭为止。 在此期间,除了主机用户之外,关闭可能不会中止,并且可能不会启动另一个关闭。
调用此函数时, uFlags 参数的值设置为EWX_FORCE可避免这种情况。 请记住,执行此操作可能会导致数据丢失。
若要为应用程序设置相对于系统中其他应用程序的关闭优先级,请使用 SetProcessShutdownParameters 函数。
在关闭或注销操作期间,允许运行的应用程序在特定时间内响应关闭请求。 如果此时间在所有应用程序停止之前过期,系统会显示一个用户界面,允许用户强行关闭系统或取消关闭请求。 如果指定了EWX_FORCE值,系统会强制运行应用程序在时间过期时停止。
如果指定了EWX_FORCEIFHUNG值,系统会强制挂起应用程序关闭,并且不显示对话框。
控制台进程接收单独的通知消息,CTRL_SHUTDOWN_EVENT或CTRL_LOGOFF_EVENT,因为情况需要。 控制台进程将这些消息路由到 其 HandlerRoutine 函数。 ExitWindowsEx 异步发送这些通知消息;因此,当调用 ExitWindowsEx 返回时,应用程序无法假定控制台通知消息已处理。
若要关闭或重启系统,调用进程必须使用 AdjustTokenPrivileges 函数来启用SE_SHUTDOWN_NAME特权。 有关详细信息,请参阅 “使用特殊特权运行”。

 

 

 

创建时间:2023.05.19  更新时间:

posted on 2023-05-19 09:43  滔Roy  阅读(229)  评论(0编辑  收藏  举报

导航