為何運行所寫程序後不關閉,win2k就無法正常關機,點關機屏幕閃一下又回到桌面
(程序中只有定議快捷鍵、使用udp控件、不顯示主窗口等一些常規代碼)

解决方案 »

  1.   

    看看以前的帖子吧
    ExitWindowsEx(EWX_POWEROFF or EWX_SHUTDOWN or EWX_FORCE,0)
    --------------------------------------
    看见了么,
    那支蛾子,
    正飞向太阳,
    那就是我!
    --------------------------------------
      

  2.   

    To:outer2000(天外流星)
    好像是nmudp的問題,將控件刪了就可以正常關機了
    請問有解決方法嗎?
      

  3.   

    To:windwather()
    偶自己寫的程序,有必要用中止進程的方法嗎?
    偶在WM_QueryEndSession寫了結束命令,但此法要關兩次機方可,有沒有更好的辦法?
      

  4.   

    function Tmain.SetPrivilege(sPrivilegeName: string; bEnabled: boolean): boolean;
    var
        TP, TPPre: TTokenPrivileges;
        Token: THandle;
        dwLength: DWORD;
    begin
        result := false;
        OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
            Token);
        try
            TP.PrivilegeCount := 1;
            if LookupPrivilegeValue(nil, PChar(sPrivilegeName),
                TP.Privileges[0].LUID) then
            begin
                if bEnabled then
                    TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
                else
                    TP.Privileges[0].Attributes := 0;
                dwLength := 0;
                Result := AdjustTokenPrivileges(Token, false, TP, sizeof(TPPre),
                    TPPre, dwLength);
            end;
        finally
            CloseHandle(Token);
        end;
    end;
    //==========================================================
    procedure Tmain.Button1Click(Sender: TObject);
    begin
            SetPrivilege('SeShutdownPrivilege', true);
            ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF, 0);
    end;
      

  5.   

    再加100分To:imageonline(不交房租) 
    菜鳥是想程序運行時點擊關機命令(或重啟、登出)時程序可以結束並順利關機(或重啟、登出)不通過程序本身利用ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE or EWX_POWEROFF, 0)來實現。
    或者哪個函數可以截獲windows的關機指令,使程序知道操作者要做的事再運行ExitWindowsEx也可
      

  6.   

    你再次send个关机的消息不就完了么!!!
    SendMessage(Self.Handle, WM_QUERYENDSESSION, 0, 0);
      

  7.   

    因为:procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      CanClose := False;
    end;
      

  8.   

    //2000下要获取权限的!下面程序在2000下是通过测试的,希望帮上你!
    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);
      exitwindowsex(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF,0);
      

  9.   

    To: shengliqiang168(ValorSlq)&imageonline(不交房租)
    用此法不管是登出、重起命令都變成是關機了
      

  10.   

    调用关机之前,调用下这个东西,
    procedure 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;
      

  11.   

    To;nyf1220(sxufe.edu.cn) 
    能否解釋一下,還是沒弄明白
    調用AdjustToken寫在哪裡,最終是否還應有exitwindowsex(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF,0)命令
    菜鳥在WMQueryEndSession中寫了,但還是要運行exitwindowsex,且沒法登出、重起
      

  12.   

    是在调用ExitWindowsEx前调用就行了,
      

  13.   

    發現一個問題:

    djyf(无聊(西湖醋鱼VS糖醋排条))
    的方法
    SendMessage(Self.Handle, WM_QUERYENDSESSION, 0, 0);
    運行程序後必須先退出程序再運行,就能正常執行win關機命令,哪位高手知道為何?