C# 下的进程间的通讯 -- 发消息篇

Net 并没有提供进程间通讯的类,其实这句话是不对的,.Net提供了强大的进程间通讯的功能,不仅可以完成本机上进程间的通讯,还可以完成网络上的任意两台计算机间的进程通讯。这些技术分别为WebService、企业级服务、.NET 远程处理,我会在后面的文章中逐步学习总结。
这里还是借助系统的功能来实现,提供一种利用发送消息的方法实现的进程间的通信。

发送方需要调用两个系统API:SendMessage与FindWindow。
非托管定义如下:


[DllImport("User32.dll",EntryPoint="SendMessage")]
privatestaticexternintSendMessage(
inthWnd,//目标窗口的handle
intMsg,//消息
intwParam,//第一个消息参数
refCOPYDATASTRUCTlParam//第二个消息参数
);

[DllImport("User32.dll",EntryPoint="FindWindow")]
privatestaticexternintFindWindow(stringlpClassName,string
lpWindowName);



还有一个数据结构:

publicstructCOPYDATASTRUCT
{
publicIntPtrdwData;
publicintcbData;
[MarshalAs(UnmanagedType.LPStr)]publicstringlpData;
}

WM_COPYDATA消息:

constintWM_COPYDATA=0x004A;

发送消息代码如下:

intWINDOW_HANDLER=FindWindow(null,@"接收窗口");
if(WINDOW_HANDLER!=0)
{
byte[]sarr=System.Text.Encoding.Default.GetBytes(txtMsg.Text);
intlen=sarr.Length;
COPYDATASTRUCTcds;
cds.dwData=(IntPtr)100;
cds.lpData=txtMsg.Text;
cds.cbData=len+1;
SendMessage(WINDOW_HANDLER,WM_COPYDATA,0,refcds);
}

接收方需要上面的那个数据结构的定义与消息常量的定义,然后重写主窗口的DefWndProc方法:

protectedoverridevoidDefWndProc(refSystem.Windows.Forms.Messagem)
{
switch(m.Msg)
{
caseWM_COPYDATA:
COPYDATASTRUCTmystr=newCOPYDATASTRUCT();
Typemytype=mystr.GetType();
mystr=(COPYDATASTRUCT)m.GetLParam(mytype);
txtMsg.Text=mystr.lpData;
break;
default:
base.DefWndProc(refm);
break;
}
}



别忘了引用命名空间:System.Runtime.InteropServices;

你可能感兴趣的:(C++,c,.net,webservice,C#)