显示关机对话框

【勇芳软件工作室】汉化HomePreviousNext

仅限Windows NT

以下示例使用InitiateSystemShutdown功能在用户登录的计算机上开始系统关机过程。应用程序必须首先启用SE_SHUTDOWN_NAME特权。

HANDLE hToken; //处理令牌的句柄

TOKEN_PRIVILEGES tkp; //指向令牌结构的指针

BOOL fResult; //系统关机标志

//获取当前的进程令牌句柄,以便我们可以关闭

//特权

if(!OpenProcessToken(GetCurrentProcess(),en

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,& hToken))

ErrorHandler("OpenProcessToken failed.");

//获取LUID作为关闭权限。

LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,

&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; //一个权限设置

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

//获取此进程的shutdown权限。

AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,

(PTOKEN_PRIVILEGES) NULL, 0);

//无法测试AdjustTokenPrivileges的返回值。

if (GetLastError() != ERROR_SUCCESS)

ErrorHandler("AdjustTokenPrivileges enable failed.");

//显示关机对话框并开始超时倒计时。

fResult = InitiateSystemShutdown(

NULL, //关闭本地计算机

“点击主窗口,然后按\\

the Escape key to cancel shutdown.", //给用户的消息

20, //超时期限

FALSE, //要求用户关闭应用

TRUE); //关机后重新启动

如果(!fResult)

{

ErrorHandler("InitiateSystemShutdown failed.");

}

//禁用关机权限。

tkp.Privileges[0].Attributes = 0;

AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,

(PTOKEN_PRIVILEGES) NULL, 0);

if (GetLastError() != ERROR_SUCCESS)

{

ErrorHandler("AdjustTokenPrivileges disable failed.");

}

如果AbortSystemShutdown功能在InitiateSystemShutdown指定的超时时间内执行,则系统不会关闭。在此示例中,用户可以通过单击应用程序的主窗口并按ESC键来防止系统关闭。该示例通过调用AbortSystemShutdown处理按键。

HANDLE hToken; //处理令牌的句柄

TOKEN_PRIVILEGES tkp; //指向令牌结构的指针

BOOL fResult; //系统关机标志

case WM_KEYDOWN:

//仅处理Escape键。

if (wParam != VK_ESCAPE)

{

break;

}

//获取当前的进程令牌句柄,以便我们可以关闭

//特权

if(!OpenProcessToken(GetCurrentProcess(),en

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,& hToken))

{

ErrorHandler("OpenProcessToken failed.");

}

//获取LUID作为关闭权限。

LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,

&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; //一个权限设置

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

//获取此进程的shutdown权限。

AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,

(PTOKEN_PRIVILEGES)NULL, 0);

//无法测试AdjustTokenPrivileges的返回值。

if (GetLastError() != ERROR_SUCCESS)

{

ErrorHandler("AdjustTokenPrivileges enable failed.");

}

//防止系统关闭。

fResult = AbortSystemShutdown(NULL);

如果(!fResult)

{

ErrorHandler("AbortSystemShutdown failed.");

}

//禁用关机权限。

tkp.Privileges[0].Attributes = 0;

AdjustTokenPrivileges(hToken,FALSE,{989 796 005}场景,0,

(PTOKEN_PRIVILEGES) NULL, 0);

if (GetLastError() != ERROR_SUCCESS)

{

ErrorHandler("AdjustTokenPrivileges disable failed.");

}

break;