主题:如何用API关机
初学者QQ
[专家分:70] 发布于 2006-03-21 14:17:00
如何用C调用API写关机的程序。
高手请指点。
必加分
回复列表 (共6个回复)
沙发
Templar9d [专家分:2110] 发布于 2006-03-23 23:07:00
包含windows.h
然后调用ExitWindowsEx
BOOL ExitWindowsEx(
UINT uFlags,
DWORD dwReason
);
uFlags的值:
EWX_LOGOFF,0,注销
EWX_SHUTDOWN,1,关机
EWX_REBOOT,2,重启
EWX_POWEROFF,8,断开电源
EWX_FORCE,4,强制终止所有程序
EWX_FORCEIFHUNG,16,强制终止位响应的程序
后面的dwReason一般不指定,具体内容可以去微软的MSDN站上查阅。
返回值为0时表示失败,非0时就表示已经开始执行关机操作。
板凳
初学者QQ [专家分:70] 发布于 2006-03-24 15:46:00
谢谢楼上的。
3 楼
029 [专家分:5460] 发布于 2006-04-01 21:39:00
上面的朋友
哪个关机是不性的
因为你没有权限
只能注销
4 楼
aizaixiiii [专家分:2130] 发布于 2006-04-03 12:18:00
var
hdlProcessHandle : Cardinal;
hdlTokenHandle : Cardinal;
tmpLuid : Int64;
tkp : TOKEN_PRIVILEGES;
tkpNewButIgnored : TOKEN_PRIVILEGES;
lBufferNeeded : Cardinal;
Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
begin
hdlProcessHandle := GetCurrentProcess;
OpenProcessToken(hdlProcessHandle,(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),hdlTokenHandle);
// Get the LUID for shutdown privilege.
LookupPrivilegevalue('', 'SeShutdownPrivilege', tmpLuid);
Privilege[0].Luid := tmpLuid;
Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1; // One privilege to set
tkp.Privileges[0] := Privilege[0];
// Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges(hdlTokenHandle,False,tkp,Sizeof(tkpNewButIgnored),tkpNewButIgnored,lBufferNeeded);
end;
先进行权限设置,然后调用关机函数
5 楼
初学者QQ [专家分:70] 发布于 2006-04-04 09:37:00
哇。这个是PASCAL程序。
我说的是C呀。
够长的这个。
6 楼
GCC [专家分:14380] 发布于 2006-04-05 20:12:00
MSDN提供的例子
BOOL MySystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
SHTDN_REASON_MINOR_UPDATE |
SHTDN_REASON_FLAG_PLANNED))
return FALSE;
return TRUE;
}
我来回复