【www.arisingsemi.com--英语培训】

send的用法
C#中使用SendMessage在进程间传递数据的实例
1 新建解决方案SendMessageExample
在解决方案下面新建三个项目:CopyDataStruct,Receiver和Sender。其中,CopyDataStruct项目的输出类型为“类库”,Receiver和Sender项目的输出类型为“Windows 应用程序”。整个实例程序的结构如下图所示。

2 CopyDataStruct项目实现
定义结构体COPYDATASTRUCT,代码如下所示。
 
1. usingSystem; 
2. pServices; 
3.
4. namespaceCopyDataStruct 
5. { 
6. publicstructCOPYDATASTRUCT 
7. { 
8. publicIntPtr dwData; 
9. publicintcbData; 
10. [MarshalAs()] 
11. publicstringlpData; 
12. } 
13. } 
编译CopyDataStruct项目生成dll,再在Receiver和Sender项目中添加对此dll的引用。
3 Sender项目实现
Sender项目仅包含一个名称为“消息发送者”的窗体,如下图所示。
 
编写窗体后端代码,如下所示。
1. usingSystem; 
2. pServices; 
3. ; 
4. usingCopyDataStruct;     
5. namespaceSender 
6. { 
7. publicpartial classfrmSender : Form 
8. { 
9. //Win32 API函数
10. [DllImport(", EntryPoint = "SendMessage")]  
11. privatestaticexternintSendMessage(inthWnd, intMsg, intwParam, refCOPYDATASTRUCT lParam);  
12.
13. [DllImport(", EntryPoint = "FindWindow")]  
14. privatestaticexternintFindWindow(stringlpClassName, stringlpWindowName);  
15.
16. constintWM_COPYDATA = 0x004A;  
17.
18. publicfrmSender()  {      InitializeComponent();          } 
19. privatevoidbtnSend_Click(objectsender, EventArgs e)  
20. {  
21. inthWnd = FindWindow(null, @"消息接受者");  
22. if(hWnd == 0)    {  
23. ("555,未找到消息接受者。
");  
24. }  
25. else
26. {  
27. byte[] sarr = es();  
28. intlen = ;  
29. COPYDATASTRUCT cds;  
30.  = (IntPtr)16();//可以是任意值
31.  = len + 1;//指定lpData内存区域的字节数
32.  = ;//发送给目标窗口所在进程的数据
33. SendMessage(hWnd, WM_COPYDATA, 0, refcds);  
34. }  
35. }  
36. }  
37. }  
38.
4  Receiver项目实现Receiver项目仅包含一个名称为“消息接受者”的窗体,如下图所示。

编写窗体的后端代码,如下所示。
1. usingSystem;  
2. ;  
3. usingCopyDataStruct;     
4. namespaceReceiver  
5. {  
6. publicpartial classfrmReceiver : Form  
7. {  
8. constintWM_COPYDATA = 0x004A;  
9. publicfrmReceiver()  {    InitializeComponent();    }    
10. protectedoverridevoidDefWndProc(refMessage m)  
11. {  
12. switch()  
13. {  
14. caseWM_COPYDATA:  
15. COPYDATASTRUCT cds = newCOPYDATASTRUCT();  
16. Type t = e();  
17. cds = (COPYDATASTRUCT)ram(t);  
18. stringstrResult = ng() + ":"+;    
19. (strResult);  
20. break;  
21. default:  
22. Proc(refm);  
23. break;  
24. }          }      }  }  
5 运行结果
运行消息发送和消息接收程序(和),效果如下图所示。 
6 实例说明
6.1 SendMessage方法参数说明
l hWnd:接收消息的窗口的句柄
l Msg:消息标识符
l wParam:32位的特定附加信息,具体取决于消息
l lParam:32位特定附加信息,具体取决于消息
6.2 WM_COPYDATA消息说明
使用WM_COPYDATA消息,lParam参数可以指向一个 COPYDATASTRUCT结构体类型的变量。
1. typedef structCOPYDATASTRUCT{  
2. ULONG_PTR dwData;  //可以是任意值
3. DWORD cb_data;  //指定lpData内存区域的字节数
4. PVOID lpData;  //发送给目录窗口所在进程的数据
5. }COPYDATASTRUCT;  
若定义的结构体不满足上面的定义,在接收端无法正确获取lParam参数指向的数据。
另外,WM_COPYDATA消息的标识符为0x004A。。

本文来源:http://www.arisingsemi.com/yuyanliuxue/93572/