Net 并没有提供进程间通讯的类,其实这句话是不对的,.Net提供了强大的进程间通讯的功能,不仅可以完成本机上进程间的通讯,还可以完成网络上的任意两台计算机间的进程通讯。这些技术分别为WebService、企业级服务、.NET 远程处理,我会在后面的文章中逐步学习总结。
这里还是借助系统的功能来实现,提供一种利用发送消息的方法实现的进程间的通信。
发送方需要调用两个系统API:SendMessage与FindWindow。
非托管定义如下:
[ DllImport ( "User32.dll" , EntryPoint = "SendMessage" )]
private static extern int SendMessage (
int hWnd , //目标窗口的handle
int Msg , // 消息
int wParam , // 第一个消息参数
ref COPYDATASTRUCT lParam // 第二个消息参数
);
[ DllImport ( "User32.dll" , EntryPoint = "FindWindow" )]
private static extern int FindWindow ( string lpClassName , string
lpWindowName );
还有一个数据结构:
{
public IntPtr dwData ;
public int cbData ;
[ MarshalAs ( UnmanagedType . LPStr )] public string lpData ;
}
WM_COPYDATA消息:
发送消息代码如下:
if ( WINDOW_HANDLER != 0 )
{
byte [] sarr = System . Text . Encoding . Default . GetBytes ( txtMsg . Text );
int len = sarr . Length ;
COPYDATASTRUCT cds ;
cds . dwData = ( IntPtr ) 100 ;
cds . lpData = txtMsg . Text ;
cds . cbData = len + 1 ;
SendMessage ( WINDOW_HANDLER , WM_COPYDATA , 0 , ref cds );
}
接收方需要上面的那个数据结构的定义与消息常量的定义,然后重写主窗口的DefWndProc方法:
{
switch ( m . Msg )
{
case WM_COPYDATA :
COPYDATASTRUCT mystr = new COPYDATASTRUCT ();
Type mytype = mystr . GetType ();
mystr =( COPYDATASTRUCT ) m . GetLParam ( mytype );
txtMsg . Text = mystr . lpData ;
break ;
default :
base . DefWndProc ( ref m );
break ;
}
}
别忘了引用命名空间:System.Runtime.InteropServices;