"如何让我的局域网消息发送软件也能接管其它机子用net send等方式发的消息"的给分帖(50分)

  • 主题发起人 主题发起人 Boblee
  • 开始时间 开始时间
To Puma Wang
你搞明白什么啦?能帖出来吗?
 
》》那是否是说,如果要用这TmdMailSlot做的发送软件,Messenger服务就必须停止?是不是这样?
那倒不一定,slot 设成别的名字试试? 不知道他的程序里设成这个有什么固定的,不过好像随便是一个什么名称的。

不过还有很多问题:
昨天在公司里,没有时间多看,简单的看看能发能收不去追究了。
不过到家里试验的时候,问题就来了:

1,Win2000 下 Computer1 关闭这个Message 服务,打开这个程序,发现Computer 2 就不能发送信息了。
2,给slot 换了一个名字,Message 服务能打开了,运行程序,Computer2 能发消息了,但是还是弹出系统的一个小对话框。
不是我想要的 在程序里写的 showmessage(msg) ;

到现在我还没有能用别的机器发(net send ip msg) 我的程序收到过!!

轻松虎老兄,来说说吧。
 
Boblee :
我决定放弃这种方案了。 我想Socket 方法也能很容易的去实现。 在服务器端写个程序,
一直运行,客户端,有个 ServerSocket 接受字符,通过接受的信息来处理。
算了,这个Net Send 的方法 看来行不通。
 
我觉得这个mailslot不是个解决办法。我也不想用它。但轻松虎我最终还是会给分的。不过不
是现在结帖,因为还没找到解决方法。
To
Puma Wang:
如果你不用Server也能解决这个发送及接收问题同,请告之。
 
这个方法是这样的,建立一个小表,存状态的StaTab[Code,Status] 对 主要数据表建一个触发器,
专门去置StaTab的标志位的。 还有一个表 专门存 Ip 的,连接到服务器上来的Client 把Ip 写进去。

服务器端做个一直跑的程序。去取StaTab。 然后去发到IP。
客户端,接受到了。
做些相应的处理。看了论坛里的很多人讨论,好像最后都是这样的方向的。


 
两位兄弟先别着急,让俺研究一下消息服务如何应用在互联网上
 
To Puma Wang:
那你这样,还是用C/S方式的。
 
为什么一定要接受SEND过来的消息呢?可以换个思路嘛。
所有SEND过来的信息都在系统的事件查看里面。
你把它读出来就可以了,变通一下,效果应该是一样的吧
 
Boblee :
是的呀,有点不伦不类的说。多了服务端的一个小程序。

arnew : 目的就是 接受这个消息,然后触发别的事件的。“得到”只是一个方面,“触发”才是关键。呵呵。
老兄 有什么招子吗?

 
我想我们讨论的目的就是要解决:
1.用户可以用net send 发消息,也可以用我的软件发。
2.如果用户装了我这个软件,那别人发给这个用户的消息我的软件能截获并显示

其实这个有很多软件已实现了,只是不知它们都是怎么做,如
http://www.winmessenger.com/ 的 winmessenger就是这样。
 
我做过这样的软件,发送很容易
接受用的Timer 和Findwindows,
因为源程序不在这儿,所以只能提示一下:)
 
发送不是问题,问题在于别人发给你的(有可用软件,也有可能用net send)的消息怎么
截获的问题。
To helpu:
Findwindows? 这又是怎么回事?
 
procedure TfrmMain.Timer1Timer(Sender: TObject);
var
hCurWindow: HWnd; // 窗口句柄
name:string;
txtlen:integer;
begin
hCurWindow := FindWindow ('#32770','信使服务 '); //注意后面有一个空格!
n:=hCurWindow ;
if (hCurWindow <> 0) and (n <> curhandle ) then
begin
Timer1 .Enabled :=false;
curhandle :=n;
hCurWindow :=FindWindowEX(hCurWindow ,0,'static',nil);
TxtLen:=sendmessage(hCurWindow ,wm_gettextlength,0,0)+1;
setlength(name,TxtLen);
sendmessage(hCurWindow ,wm_gettext,txtlen,LongInt(@name[1]));
addtolistview(3,string(name));
if soundchk .Checked then sndPlaySound('receive.wav',SND_FILENAME ); //sndplaysound(ptrSound,snd_async or snd_Memory);
if sendtonotepadchk .Checked then begin
if (notepadhandle = 0) then begin
ShowMessage('你还没有指定窗体!'+#13+'不能“发送到指定”');
exit;
end;
SendMessage(n,WM_CLOSE ,0,0);
SendDBCSString(notepadhandle ,string(name+#13#10#13#10));
end;
end;
Application.ProcessMessages ;
Timer1 .Enabled :=true;
end;
 
To helpU:
你给的样例不能用,请检查一下,帮我纠正一下:里面有很多变量未定义。
 
上一个程序在收到后能根据选择将消息发到指定得地方,一般来说是记事本或者Word等,
现在,给你一个简化的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
n,curhandle:integer;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
hCurWindow: HWnd; // 窗口句柄
name:string;
txtlen:integer;
begin
hCurWindow := FindWindow ('#32770','信使服务 '); //注意后面有一个空格!
n:=hCurWindow ;
if (n <> 0) and (n <> curhandle ) then
begin
Timer1 .Enabled :=false;
curhandle :=n;
hCurWindow :=FindWindowEX(hCurWindow ,0,'static',nil);
TxtLen:=sendmessage(hCurWindow ,wm_gettextlength,0,0)+1;
setlength(name,TxtLen);
sendmessage(hCurWindow ,wm_gettext,txtlen,LongInt(@name[1]));
ShowMessage(string(name));
Timer1 .Enabled :=true;
end;
end;
end.

应该没有问题了:)
 
我试试。:)
 
好用,但我想问一下,如何让系统的那个消息不弹出来,我参考你两次的代码,我发现,如果
我先把系统的消息窗关了后,程序就得不到消息了,有无即不让系统的消息窗弹出,我的程序
又能得到消息的解决方案。:)
 
其实,你所有收到的消息,在系统事件中都有的(用事件查看器看看系统日志),其类型为“信息”
你就是“先把系统的消息窗关了”,系统日志也会有记录的:)
 
怎么才能读到日志中的消息?
 
后退
顶部