procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  NMUDP1.Free;
  Message.Result := 1;
end;

解决方案 »

  1.   

    to : r3(去留无意)
    可是我这个程序是在托盘区中加入图标的,用的trayicon311的控件。当主窗体是显示时就ok,关机正常,当主窗体隐藏时,这家伙却收不到WM_QUERYENDSESSION这个消息。关不了机
      

  2.   

    查了一下以前的帖子,说这个NMUDP是有这个BUG。当小弟我还是不死心,发现程序主窗口显示时收到一个WM_QUERYENDSESSION的消息,用:
    From1.close;
    Message.Result := 1;
    关机正常,但是当主窗口隐藏时就收到一个WM_ENDSESSION的消息,用:From1.close;
    Message.Result := 1;
    的话,程序是关了,但还是关不了机。想一想可能是程序回答windows关机询问时返回的信息无法让它继续下一个程序的询问。但也只有两种可能呀,一种是回答可以关闭对话,一种是回答不可以关闭对话。小弟又不知道他妈的微软到底要一个怎么鬼值。给message.result付值1也不行,0也不行,-1也不行,我想还有一种办法是让windows在关机时跳过这个程序,不给它发WM_QUERYENDSESSION消息或者象hook一样给message.result:=callnexthook(.......);把它让给下一个程序对象去回答。但小弟我不会写呀!哪位大侠行行好,帮帮忙!
      

  3.   

    谁能告诉我哪有indy的控件下载??
      

  4.   

    谢谢,我找到下载了,可惜不会用。不知哪有用tidudp的DEMO看!?我这样用老是收不到,不知哪出了错!
    SERVER端:
    procedure TForm1.SIdUDPUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    var
     readcor:pchar;
     readstr:string;
    begin
      getmem(readcor,adata.Size);
      AData.ReadBuffer(readcor,adata.Size);
      readstr:=StrPas(readcor);
      showmessage('KK'+readstr);
    end;
    CLIENT端:
    procedure Tmainform.Button5Click(Sender: TObject);
    var
    sendcode:array[0..29] of char;
    begin
    sendCode:='OK?';
    CIDUDP.Active:=TRUE;
    CIDUDP.SendBuffer(SENDCode,10);
    end;
      

  5.   

    搞了半天是AData.ReadBuffer()的参数不能用pchar,一定要
    readcor:array [0..29] of char;
    然后就读到了。TMNUDP倒可以用formip得到那边的IP地址,这个鸟怎么得到呢?一定要在client端发CIDUDP.SEND(Ahost,Aport,AData)告诉他吗?
      

  6.   

    呀,错了,错了,原来CIDUDP.SEND(Ahost,Aport,AData)中的Ahost还是对方的 IP!哪位有DEMO说句话嘛!!做点好事,下载的这个indy控件连帮助都没有。SHIT