【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。。