我写Indy UDP 写了一个程序,不知道怎么会引起无法正常关机!   我查了,我也想了很多办法:
   1 在 QueryEndSession (Msg.Result :=1),
    WMEndSession (Message.EndSession :=True;) 事件里有响应,
    而在 QueryClose,Close 却没有响应。   2  如果在WMEndSession 执行 Application.Termination 或 Close,
     程序关掉了,关机程序却停止执行了!
    1.主窗体 QueryEndSession, QueryClose,Close 事件都作了正确设置!
    2.在KeyPressDown 下屏蔽了 ALT+F4
   
   各位同仁,给点意见^_^!

解决方案 »

  1.   

    我也遇到过,如果程序中用到了indy udp和tcp控件,只要程序没退出,就无法关闭windows(98下可正常关机,但2000/xp下无法正常关闭,要关两下)。
    后来发现是因为对queryendsession消息处理后,第一次只会关闭程序。
      

  2.   

    你声明拦截WM_QueryEndSession消息的过程看看
        procedure WMQueryEndsession(Var Msg:TMessage);Message WM_QueryEndSession;procedure Tclient.WMQueryEndsession(var Msg: TMessage);
    begin
      Msg.Result := 1;
      close;  //将自己的程序关闭
    end;
    如果还有问题 你在CLOSEQUERY事件中手动释放INDY控件看看。
      

  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;