我使用ExitWindowsEx(EWX_SHUTDOWN and EWX_POWEROFF,1)来实现关机,但在关闭的过程中总是出现什么:是否保存、出现什么错误等等烦人的窗口,总是要你点击它才能继续,而且有时候还会出现画面定格的现象,就像死机一样。有什么方法能够保证程序绝对能快速关机,请给出代码

解决方案 »

  1.   

    exitwindowsex(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF,0);
      

  2.   

    delphi或者bcb代码的解决方案都行,当然最好是两种代码都有
      

  3.   

    写过“关机”,不在身边,以后SHOW
      

  4.   

    ExitWindowsEx(EWX_POWEROFF or EWX_SHUTDOWN ,0);//关机
    ExitWindowsEx(EWX_POWEROFF or EWX_REBOOT,0);//重启计算机
      

  5.   

    使用ewx_force参数,进行强制关机,可以解决
      

  6.   

    ExitWindowsEx(EWX_FORCE | EWX_POWEROFF | EWX_SHUTDOWN ,0);//关机
    ExitWindowsEx(EWX_FORCE | EWX_POWEROFF | EWX_REBOOT,0);//重启计算机
      

  7.   

    那是因为你的权限这支不够
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);  private
        { Private declarations }
        procedure AdjustToken;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.AdjustToken();
    var
      hdlProcessHandle : Cardinal;
      hdlTokenHandle : Cardinal;
      tmpLuid : Int64;
      tkpPrivilegeCount : 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;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         AdjustToken;
         ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), $FFFF);
    end;end.
      

  8.   

    你用的是什么系统?
        如果是Win98,只需
    exitwindowsex(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF,0);就可以了.    如果是Win2000,WinXP那就需要先获得权限,再关机.
    //获得权限
    procedure TForm1.AdjustToken;
    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;//关机
    procedure TForm1.ShutDown;
    begin
      AdjustToken;
      exitwindowsex(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF,0);
    end;如果你还是不行,给我你的E-Mail,我给你我的程序试试.
      

  9.   

    http://www.playicq.com/dispdoc.php?id=2784
      

  10.   

    在win2k下不和win9x一样,你要有关闭计算机的权限才可以。你还是搜一下以前的贴子吧。
      

  11.   

    exitwindowsex(EWX_SHUTDOWN,0);在win98下挺好用的
      

  12.   

    关闭计算机就这几招 注:完全翻译整理自MSDN。非常简单. Vcbear.“系统ShutDown”属于Windows系统的一种基本服务。功能上有“关闭系统”,“注销用户”,“锁定工作站”3中操作。SDK中提供了几个函数,来对此服务进行调用。“关闭系统”功能使计算机可以被安全的关闭。所有在文件系统里缓冲的内容都被强制写入磁盘。然后,显示相应的对话框,提示用户计算机将被关闭或者已经准备好被关闭。可选的情况一般是计算机在关闭后重起,而不是直接切断电源。如果一个进程调用“注销”功能函数,则该进程所在的安全环境范围内的所有进程都被终止,使当前的用户退出系统。一个登陆对话框被显示,期待新用户的登陆。“锁定工作站”功能使你可以在离开计算机的时候,保护计算机屏幕不被未授权的用户看到。要解除锁定,必须用管理员或着授权用户的帐号和密码重新登陆。
    如何关闭系统: 程序可以用两种方式关闭本地或远程计算机
    直接关闭系统
    关闭系统并重启
    Windows NT/2000 及后续版本: 程序必须拥有SE_SHUTDOWN_NAME权限才能成功调用关闭函数。 
    ExitWindowsEx函数可以用来关闭系统。如函数成功调用,系统对每个窗口发送WM_QUERYENDSESSION 消息,询问窗口所属的程序是否可以被终止。收到此消息的程序应该进行响应,清除环境释放资源,然后返回TRUE表示自己可以被终止。然而调用ExitWindowEx的时候如果指定了EXW_FORCE,则系统强行终止相关的进程并关闭,这样可能导致数据的丢失。这是一段在NT/2000中调用ExitWindowEx关闭系统的程序(强制关闭所有程序)。在windows95/98/me中直接调用ExitWindowEx即可。
    -----------------------------------------------------------------------------------------------------------
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; // Get a token for this process. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    Error("OpenProcessToken"); // 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); // Cannot test the return value of AdjustTokenPrivileges. if (GetLastError() != ERROR_SUCCESS) error("AdjustTokenPrivileges"); // Shut down the system and force all applications to close. if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) error("ExitWindowsEx");