如何在关机时自动关闭我的程序?
现在关机的时候如果我的程序还在运行的话电脑就关不了,不知道什么原因。

解决方案 »

  1.   

    截获并处理主窗体的WM_QUERYENDSESSION消息。比如在收到这个消息以后关闭NMFAST系列的组件。
      

  2.   

    关机的消息是:WM_QUERYENDSESSION
    WM_QUERYENDSESSION 
    nSource = (UINT) wParam;    // source of end-session request 
    fLogOff = lParam            // logoff flag 
     
    Parameters
    nSource 
    Reserved for future use. 
    fLogOff 
    Value of lParam. Indicates whether the user is logging off or shutting down the system. Supported values include: ENDSESSION_LOGOFF. 
    Return Values
    If an application can terminate conveniently, it should return TRUE; otherwise, it should return FALSE.  
     
    当执行exitwindows函数时
    它会发送一个WM_QUERYENDSESSION消息给所有正在运行的程序。
      

  3.   

    procedure TForm1.Button2Click(Sender: TObject);
    var EWX_SHUTDOWN,EWX_FORCE:integer;
        VerInfo: TOSVersionInfo;
        hToken: THANDLE;
        tkp: TOKEN_PRIVILEGES;
        Nothing: Cardinal;begin
    EWX_SHUTDOWN:=1;
    EWX_FORCE:=4;begin
      VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
      GetVersionEx(VerInfo);
        if VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
          OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
            hToken);
          LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
          tkp.PrivilegeCount := 1;
          tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
          AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, Nothing);
        end;
        ExitWindowsEx(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF, 0);
    end;EXITWINDOWSEX(EWX_POWEROFF,0);
    EXITWINDOWSEX(EWX_FORCE OR EWX_SHUTDOWN,0);
    end;