我写了一段关机代码,2K的,可以关机,但为什么只能到“你可以安全关机了”的画面,不能关闭电源,这不是还要我手动关机,我的电脑已被我设置成自动关闭电源了。

解决方案 »

  1.   

    应该是你的系统设置问题。你使用Windwos2000关机,是不是也会出现这种情况?我做的程序没有发现这种问题。
      

  2.   

    在安装2K时,你将ACPI打开,或APM
    或打开后,将系统-》设备管理器-》计算机-》更新驱动程序-》ACPI....
      

  3.   

    电源是AT电源,如果是ATX的应该没有此现象
      

  4.   

    1,禁用快速关机。
    2,关机时的声音文件丢失。
    3,高级电源管理没有ENABLED
    4,其它的原因
    5,:)
      

  5.   

    1 电源至少必须是atx标准
    2 CMOS设置支持
    3 用Exitwindowsex(ewx_poweroff or ewx_shurdown,0)
      

  6.   

    改BIOS啊而且电源要支持ATX,一般98年后的电脑都没事
      

  7.   

    应该是电源问题 ATX可以自动关掉电源
      

  8.   

    我也碰到同样的问题!好像不是电源管理的问题。因为在系统设置不变的情况下,用win2000自己的关机菜单就可以关闭电源,而用代码就不行!我的代码如下:
    procedure TForm1.Shutdown();
    var
      rl: Cardinal;
      hToken: Cardinal;
      tkp: TOKEN_PRIVILEGES;
    begin
          OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
          if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
          begin
            tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
            tkp.PrivilegeCount := 1;
            AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
          end;
          ExitWindowsEx(EWX_SHUTDOWN,0);
    end;
      

  9.   

    以下函数,2000测试没有任何问题!function TFrmMain.ShutDownSystem(si:integer):BOOL;
    var
      hProcess,hAccessToken:THandle;
      LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
      TOKEN_PRIVILEGES: TTokenPrivileges;
      BufferIsNull:DWORD;
    Const
      SE_SHUTDOWN_NAME='SeShutdownPrivilege';
    begin
      hProcess:=GetCurrentProcess();  OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);
      LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);
      LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;
      TOKEN_PRIVILEGES.PrivilegeCount:=1;
      TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;
      BufferIsNull:=0;   AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVILEGES),Nil,BufferIsNull);
       case si of
       1:
          ExitWindowsEx(EWX_REBOOT, 0);  //重启
       2:
          ExitWindowsEx(EWX_POWEROFF, 0); //关机
       end;
       ShutDownSystem:=True;
    end;
      

  10.   

    最主要的问题是大家使用函数Exitwindowsex时都用了如下参数ewx_shurdown,而没用ewx_poweroff ,前面只有两位老兄注意到了这一点:firetoucher(蹈火者) 和smilycella(士多啤梨);建议大家碰到类似的问题多查一下MSDN,可以查到这个问题的!!!!
    另外: 
    1 电源至少必须是atx标准
    2 CMOS设置支持
    3 用Exitwindowsex(ewx_poweroff or ewx_shurdown,0)可以结贴了,希望能对搂主有所帮助!
      

  11.   

    在 NT 中要 ewx_poweroff 与 ewx_shurdown 常数同时使用
    而在 9x 中只要 ewx_shurdown 即可-----------------------------------
    现在混水园了!
      

  12.   

    写错了
    ewx_poweroff or ewx_shutdown-----------------------------------
    现在混水园了!
      

  13.   

    我上面所说的在Win2K下试过,没有问题;我以前也碰到过这个问题,但参数设置正确后就没问题了!
      

  14.   

    首先要提升权限procedure _AdjustPrivileges();
    var hdlTokenHandle:Cardinal;tmpLuid:TLargeInteger;tkp:TOKEN_PRIVILEGES;lBufferNeeded:Cardinal;
        tkpNewButIgnored:TTokenPrivileges;
    begin
        OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hdlTokenHandle);
        LookupPrivilegeValue('','SeShutdownPrivilege',tmpLuid);    tkp.PrivilegeCount :=1;
        tkp.Privileges[0].Luid :=tmpLuid;
        tkp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hdlTokenHandle,false,tkp,Sizeof(tkpNewButIgnored),tkpNewButIgnored,lBufferNeeded);end;
      

  15.   

    就是 EWX_PowerOff 的问题。
      

  16.   

    给你一个参考
    procedure TKStatus.ShutDown;
    const
      SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
    var
      hToken:THandle;
      tkp:TTokenPrivileges;
      tkpo:TTokenPrivileges;
      zero:DWORD;
    begin
      if Pos('Windows NT',GetWinVersion) = 1 then
         begin
           zero := 0;
           if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
              begin
                Exit;
              end;
           if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid) then
              begin
                Exit;
              end;
           tkp.PrivilegeCount := 1;
           tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
           AdjustTokenPrivileges(hToken,False,tkp,SizeOf(TTokenPrivileges),tkpo,zero);
           if Boolean(GetLastError()) then
              begin
                Exit;
              end
           else
             ExitWindowsEx(EWX_FORCE or EWX_POWEROFF,0);        //ExitWindowsEx(EWX_SHUTDOWN,0); //
         end
      else
         begin
           ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN,0);      //ExitWindowsEx(EWX_SHUTDOWN,0); //
         end;
    end;
      

  17.   

    你那边其实就是参数设置不妥而已,把EWX_SHUTDOWN改为EWX_POWEROFF就可以了,
    WIN98下面EWX_SHUTDOWN就可以了。
      

  18.   

    既然能关到“你可以安全关机了”说明权限没问题了,就是一个参数的问题:or EWX_PowerOff;
    真不知道要吵到什么时间~~~~~~~~~
      

  19.   

    代码没有问题。用EWX_SHUTDOWN&EWX_POWEROFF 两个参数。
    我的机子一个就可以搞定了。