BOOL ExitWindowsEx(
    UINT uFlags, // shutdown operation
    DWORD dwReserved  // reserved
   );
If the EWX_FORCE value is specified, Windows always forces applications to close and does not display the dialog box.  

解决方案 »

  1.   

    EWX_FORCE  这个好象可以吧。The ExitWindowsEx function either logs off, shuts down, or shuts down and restarts the system. BOOL ExitWindowsEx(    UINT uFlags, // shutdown operation
        DWORD dwReserved  // reserved
       );
     ParametersuFlagsSpecifies the type of shutdown. This parameter must be some combination of the following values: Value Meaning
    EWX_FORCE Forces processes to terminate. When this flag is set, Windows does not send the messages WM_QUERYENDSESSION and WM_ENDSESSION to the applications currently running in the system. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
    EWX_LOGOFF Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off.
    EWX_POWEROFF Shuts down the system and turns off the power. The system must support the power-off feature.Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section. Windows 95: Security privileges are not supported or required.
    EWX_REBOOT Shuts down the system and then restarts the system. Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section. Windows 95: Security privileges are not supported or required.
    EWX_SHUTDOWN Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped. Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section. Windows 95: Security privileges are not supported or required.
     dwReservedReserved; this parameter is ignored.  Return ValuesIf the function succeeds, the return value is nonzero.
    If the function fails, the return value is zero. To get extended error information, call GetLastError. ResThe ExitWindowsEx function returns as soon as it has initiated the shutdown. The shutdown or logoff then proceeds asynchronously. 
    During a shutdown or log-off operation, applications that are shut down are allowed a specific amount of time to respond to the shutdown request. If the time expires, Windows displays a dialog box that allows the user to forcibly shut down the application, to retry the shutdown, or to cancel the shutdown request. If the EWX_FORCE value is specified, Windows always forces applications to close and does not display the dialog box. The ExitWindowsEx function sends a separate notification message, CTRL_SHUTDOWN_EVENT or CTRL_LOGOFF_EVENT as the situation warrants, to console processes. A console process routes these messages to its HandlerRoutine functions, which are added and removed by calls to the SetConsoleCtrlHandler function. ExitWindowsEx sends these notification messages asynchronously; thus, an application cannot assume that the console notification messages have been handled when a call to ExitWindowsEx returns. Windows NT: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges. 
    Windows 95: Security privileges are not supported or required.See AlsoAdjustTokenPrivileges, ExitWindows, HandlerRoutine, SetConsoleCtrlHandler 
      

  2.   

    ExitWindowsEx(EWX_FORCE OR EWX_SHUTDOWN);
      

  3.   

    可以给个示例吗?
    而且我想问问:好象WIN2000不可以直接调用这个函数实现把
      

  4.   

    //*******************关机函数32,95 or 2000 ,nt*******************************
    function Tform1.GetWinVersion: String;
      var
         VersionInfo : TOSVersionInfo;
         OSName      : String;
      begin
         // set the size of the record
         VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );     if Windows.GetVersionEx( VersionInfo ) then
            begin
               with VersionInfo do
               begin
                  case dwPlatformId of
                     VER_PLATFORM_WIN32s   : OSName := 'Win32s';
                     VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';
                     VER_PLATFORM_WIN32_NT      : OSName := 'Windows NT';
                  end; // case dwPlatformId
                  Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +
                            #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
               end; // with VersionInfo
            end // if GetVersionEx
         else
            Result := '';
      end;  procedure Tform1.ShutDown;
      const
        SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';   // Borland forgot this declaration
      var
        hToken       : THandle;
        tkp          : TTokenPrivileges;
        tkpo         : TTokenPrivileges;
        zero         : DWORD;
      begin
        if Pos( 'Windows NT', GetWinVersion) = 1  then // we've got to do a whole buch of things
           begin
              zero := 0;
              if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
                 begin
                   MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
                   Exit;
                 end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
              if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
                 begin
                   MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
                   Exit;
                 end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
              // SE_SHUTDOWN_NAME
              if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
                 begin
                    MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );
                    Exit;
                 end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
              tkp.PrivilegeCount := 1;
              tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;          AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
              if Boolean( GetLastError() ) then
                 begin
                    MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );
                    Exit;
                 end // if Boolean( GetLastError() )
              else
                 ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
            end // if OSVersion = 'Windows NT'
         else
            begin // just shut the machine down
              ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
            end; // else
      end;
     
      

  5.   

    同意 zswang:  搞一个继电器,控制主电源