主题:ExitWindowsEx(EWX_SHUTDOWN,0)关不了机?
JasonLiu
[专家分:0] 发布于 2005-10-29 09:27:00
[color=000080]关机问题:[/color]
在程序中执行以下语句:
ExitWindowsEx(EWX_SHUTDOWN,0);
或
DWORD tmp;
ExitWindowsEx(EWX_SHUTDOWN,tmp);
但关不了机?为何?
回复列表 (共12个回复)
沙发
JasonLiu [专家分:0] 发布于 2005-10-29 09:37:00
补充一点:
我用的环境是C++ Builder6/windows2000.
板凳
megadeath [专家分:460] 发布于 2005-10-29 21:24:00
win9x 的话可以用ExitWindowEx直接关机,但是在WinNT内核系统下需要先获得特殊权限才能关机
用 OpenProcessToken 和 LookupPrivilegeValue 获得并制定特权,用AdjustTokenPrivileges启动特权,然后再用 ExitWindowsEx 关机
具体用法可以查MSDN
3 楼
JasonLiu [专家分:0] 发布于 2005-10-31 12:58:00
谢谢megadeath!
但是我手头暂时没有MSDN,而且对c++builder不是很熟,能不能再说具体点呢?
4 楼
liqi6460 [专家分:320] 发布于 2005-10-31 15:21:00
//Win2000&WinNT实现的代码
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF, 0);
}
//Win9x实现的代码
ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF, 0);
5 楼
JasonLiu [专家分:0] 发布于 2005-11-01 14:23:00
[em2] [color=800000]谢谢liqi6064[/color]
在程序中加上你提供的代码,现在可以关机了!
6 楼
JasonLiu [专家分:0] 发布于 2005-11-02 08:49:00
TO liqi6064:
通过再次仔细测试与观察,我发现你提供的代码,不能正常关机,而只是把桌面程序关掉,但桌面背景一直保持存在,最后发现,一定要通过主机箱电源按钮控制才能真正关机!
请给予解答,谢谢啦!
7 楼
liqi6460 [专家分:320] 发布于 2005-11-02 10:23:00
不客气
你的ExitWindowsEx(EWX_SHUTDOWN, 0);中加EWX_POWEROFF了吗?该参数既是关电源,没加就不能关电源,正确的应是ExitWindowsEx(EWX_SHUTDOWN+EWX_POWEROFF, 0)。
8 楼
JasonLiu [专家分:0] 发布于 2005-11-02 14:08:00
ExitWindowsEx(EWX_SHUTDOWN, 0);
或
ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF, 0);
或
ExitWindowsEx(EWX_SHUTDOWN+EWX_POWEROFF, 0);
现象都一样,为什么呵?
9 楼
liqi6460 [专家分:320] 发布于 2005-11-03 14:20:00
我试了很多遍没有你说的现象,你的2000系统是自动关机还是须按机箱电源按钮?
10 楼
chenzhou851025 [专家分:300] 发布于 2005-11-21 18:27:00
我试了一下liqi6460的程序,为什么在CB环境中运行时有用,直接点击.exe 文件关不了机啊,我用的是xp系统,能不能解释一下为什么啊
我来回复