我有什么方法可以截获windows信使服务的消息内容??

解决方案 »

  1.   

    笨办法:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Handle:THandle;
      Buf: array[0..1024] of Char;
    begin
      Handle:=FindWindow(nil,'信使服务 ');//注意,后面有一个空格
      Handle:=FindWindowEX(Handle,0,'static',nil);
      SendMessage(Handle, WM_GETTEXT, 1024, Integer(@Buf));
      Memo1.Text:=buf;
    end;
      

  2.   

    ksaiy(消失在人海-喜欢昆明的花) ( ) 大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!大哥现身!!
      

  3.   

    windows信使服务其实用的是Mailslot功能,代码如下
    procedure TMailSlotServer.Open;
    var
        ASlotName: AnsiString;
    const
        SYSMAILSLOT = 'messngr';//信使的邮槽名
    begin
        if FActive then Exit;
        //  Mailslot 识别名称
        ASlotName := '\\.\mailslot\' + SYSMAILSLOT;
        FHandle := CreateMailslot(
            pchar(ASlotName), // MailSlot 识别名称
            0, // 讯息长度的最大值,设为零表示不限
            MAILSLOT_WAIT_FOREVER, // read time-out
            nil); // 安全属性,先暂时采用预设值
        if FHandle = INVALID_HANDLE_VALUE then
            FActive := False
        else
        begin
            FActive := True;
            FWaitThread.Resume;
        end;
    end;
    然后进行监听(最好用单独的线程来监听):
    procedure TMailSlotServer.ReadFromMailSlot;
    var
        NextSize: DWORD;
        MessageCount: DWORD;
        Result: BOOL;
        Buffer: pchar;
    begin
        if FHandle = INVALID_HANDLE_VALUE then Exit;
        // 侦测 MailSlot 中是否有资料
        Result := GetMailslotInfo(Fhandle, nil, 
            NextSize, @MessageCount, nil);
        if not Result or (NextSize = MAILSLOT_NO_MESSAGE) then
            Exit;
        // 如果还有资料 (MessageCount <> 0),逐一读出资料
        while Result and (MessageCount <> 0) do
        begin
            // 资料的长度
            Buffer := AllocMem(NextSize + 1);
            try
                // 读出资料
                FileRead(Fhandle, Buffer^, NextSize);
                if Assigned(FOnDataAvailable) then
                FOnDataAvailable(Self, StrPas(Buffer));
            finally
                FreeMem(Buffer, NextSize + 1);
            end;
            // 继续看看 MailSlot 中还有没有资料
            Result := GetMailslotInfo(Fhandle, nil,
            NextSize, @MessageCount, nil);
        end;
    end;发送用WriteFile(hToSlot,//目标邮槽句柄
                          Pointer(Data)^,
                          Length,
                          BytesWritten,
                          NIL)) 
    但首先要知道信使服务的发送格式,监听也一样网络上有一个mdMailslot组件提供完整功能
      

  4.   

    Mailslot 截获windows信使服务 好象比較多用在 win9x, 到了 nt,2k, 大多直接用 udp 直接收取與發送
      

  5.   

    var
      Handle:THandle;
      Buf: array[0..1024] of Char;
    begin
      Handle:=FindWindow(nil,'信使服务 ');//注意,后面有一个空格
      Handle:=FindWindowEX(Handle,0,'static',nil);
      SendMessage(Handle, WM_GETTEXT, 1024, Integer(@Buf));
      Memo1.Text:=buf;
    end;