回 帖 发 新 帖 刷新版面

主题:ExitWindowsEx(EWX_SHUTDOWN,0)关不了机?

[color=000080]关机问题:[/color]

  在程序中执行以下语句:

  ExitWindowsEx(EWX_SHUTDOWN,0);
  或
  DWORD tmp;
  ExitWindowsEx(EWX_SHUTDOWN,tmp);

  但关不了机?为何?

回复列表 (共12个回复)

沙发

补充一点:

我用的环境是C++ Builder6/windows2000.

板凳

win9x 的话可以用ExitWindowEx直接关机,但是在WinNT内核系统下需要先获得特殊权限才能关机

用 OpenProcessToken 和 LookupPrivilegeValue 获得并制定特权,用AdjustTokenPrivileges启动特权,然后再用 ExitWindowsEx 关机

具体用法可以查MSDN

3 楼

谢谢megadeath!
但是我手头暂时没有MSDN,而且对c++builder不是很熟,能不能再说具体点呢?

4 楼

//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 楼

[em2] [color=800000]谢谢liqi6064[/color]

在程序中加上你提供的代码,现在可以关机了!

6 楼

TO liqi6064:

   通过再次仔细测试与观察,我发现你提供的代码,不能正常关机,而只是把桌面程序关掉,但桌面背景一直保持存在,最后发现,一定要通过主机箱电源按钮控制才能真正关机!

   请给予解答,谢谢啦!

7 楼

不客气

你的ExitWindowsEx(EWX_SHUTDOWN, 0);中加EWX_POWEROFF了吗?该参数既是关电源,没加就不能关电源,正确的应是ExitWindowsEx(EWX_SHUTDOWN+EWX_POWEROFF, 0)。

8 楼


ExitWindowsEx(EWX_SHUTDOWN, 0);

ExitWindowsEx(EWX_SHUTDOWN|EWX_POWEROFF, 0);

ExitWindowsEx(EWX_SHUTDOWN+EWX_POWEROFF, 0);

现象都一样,为什么呵?

9 楼

我试了很多遍没有你说的现象,你的2000系统是自动关机还是须按机箱电源按钮?

10 楼

我试了一下liqi6460的程序,为什么在CB环境中运行时有用,直接点击.exe 文件关不了机啊,我用的是xp系统,能不能解释一下为什么啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册