C#中使用SendMessage在进程间传递数据的实例

摘要:
1新建解决方案SendMessageExample在解决方案下面新建三个项目:CopyDataStruct,Receiver和Sender。usingSystem;usingSystem.Runtime.InteropServices;namespaceCopyDataStruct{publicstructCOPYDATASTRUCT{publicIntPtrdwData;publicintcbData;[MarshalAs]publicstringlpData;}}编译CopyDataStruct项目生成dll,再在Receiver和Sender项目中添加对此dll的引用。3Sender项目实现Sender项目仅包含一个名称为“消息发送者”的窗体,如下图所示。");}else{byte[]sarr=System.Text.Encoding.Default.GetBytes;intlen=sarr.Length;COPYDATASTRUCTcds;cds.dwData=Convert.ToInt16;//可以是任意值cds.cbData=len+1;//指定lpData内存区域的字节数cds.lpData=txtString.Text;//发送给目标窗口所在进程的数据SendMessage;}}}}4Receiver项目实现Receiver项目仅包含一个名称为“消息接受者”的窗体,如下图所示。

1新建解决方案SendMessageExample

在解决方案下面新建三个项目:CopyDataStruct,Receiver和Sender。

其中,CopyDataStruct项目的输出类型为“类库”,Receiver和Sender项目的输出类型为“Windows应用程序”。

整个实例程序的结构如下图所示。

C#中使用SendMessage在进程间传递数据的实例第1张

2CopyDataStruct项目实现

定义结构体COPYDATASTRUCT,代码如下所示。

using System;

using System.Runtime.InteropServices;

namespace CopyDataStruct

{

public struct COPYDATASTRUCT

{

public IntPtr dwData;

public int cbData;

[MarshalAs(UnmanagedType.LPStr)]

public string lpData;

}

}

编译CopyDataStruct项目生成dll,再在Receiver和Sender项目中添加对此dll的引用。

3Sender项目实现

Sender项目仅包含一个名称为“消息发送者”的窗体,如下图所示。

C#中使用SendMessage在进程间传递数据的实例第2张

编写窗体后端代码,如下所示。

using System;

using System.Runtime.InteropServices;

using System.Windows.Forms;

using CopyDataStruct;

namespace Sender

{

public partial class frmSender : Form

{

//Win32 API函数

[DllImport("User32.dll", EntryPoint = "SendMessage")]

private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

[DllImport("User32.dll", EntryPoint = "FindWindow")]

private static extern int FindWindow(string lpClassName, string lpWindowName);

const int WM_COPYDATA = 0x004A;

public frmSender()

{

InitializeComponent();

}

private void btnSend_Click(object sender, EventArgs e)

{

int hWnd = FindWindow(null, @"消息接受者");

if (hWnd == 0)

{

MessageBox.Show("555,未找到消息接受者!");

}

else

{

byte[] sarr = System.Text.Encoding.Default.GetBytes(txtString.Text);

int len = sarr.Length;

COPYDATASTRUCT cds;

cds.dwData = (IntPtr)Convert.ToInt16(txtInt.Text);//可以是任意值

cds.cbData = len + 1;//指定lpData内存区域的字节数

cds.lpData = txtString.Text;//发送给目标窗口所在进程的数据

SendMessage(hWnd, WM_COPYDATA, 0, ref cds);

}

}

}

}

4Receiver项目实现

Receiver项目仅包含一个名称为“消息接受者”的窗体,如下图所示。

C#中使用SendMessage在进程间传递数据的实例第3张

编写窗体的后端代码,如下所示。

using System;

using System.Windows.Forms;

using CopyDataStruct;

namespace Receiver

{

public partial class frmReceiver : Form

{

const int WM_COPYDATA = 0x004A;

public frmReceiver()

{

InitializeComponent();

}

protected override void DefWndProc(ref Message m)

{

switch (m.Msg)

{

case WM_COPYDATA:

COPYDATASTRUCT cds = new COPYDATASTRUCT();

Type t = cds.GetType();

cds = (COPYDATASTRUCT)m.GetLParam(t);

string strResult = cds.dwData.ToString() + ":" +cds.lpData;

lsvMsgList.Items.Add(strResult);

break;

default:

base.DefWndProc(ref m);

break;

}

}

}

}

5运行结果

运行消息发送和消息接收程序(Sender.exe和Receiver.exe),效果如下图所示。

C#中使用SendMessage在进程间传递数据的实例第4张

6实例说明

6.1 SendMessage方法参数说明

  • hWnd:接收消息的窗口的句柄
  • Msg:消息标识符
  • wParam:32位的特定附加信息,具体取决于消息
  • lParam:32位特定附加信息,具体取决于消息

6.2WM_COPYDATA消息说明

使用WM_COPYDATA消息,lParam参数可以指向一个COPYDATASTRUCT结构体类型的变量。

typedef struct COPYDATASTRUCT{

ULONG_PTR dwData; //可以是任意值

DWORD cb_data; //指定lpData内存区域的字节数

PVOID lpData; //发送给目录窗口所在进程的数据

}COPYDATASTRUCT;

若定义的结构体不满足上面的定义,在接收端无法正确获取lParam参数指向的数据。

另外,WM_COPYDATA消息的标识符为0x004A。

免责声明:文章转载自《C#中使用SendMessage在进程间传递数据的实例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇printf 格式化输出符号详细说明(转)DB2 replace into实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[置顶] 在C#中SendMessage和PostMessage的参数传递

用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。 5、在 Windows 2000/XP 里,每个消息队列最多只能存放 10,000 个 Post 的消息,超过的还没被处理的将不...

SendMessage模拟按键所需的虚拟键码

Virtual-Key Codes The following table shows the symbolic constant names, hexadecimal values, and mouse or keyboard equivalents for the virtual-key codes used by the system. The c...

Android sendMessage 与 obtainMessage (sendToTarget)比较

话说在工作中第一次接触android 的Handler 的时候,不知道怎么去关注性能。 记得当时这么写的: Message msg = new Message() msg.what = xxx; msg.arg1 = xxx; msg.arg2 = xxx; handler.sendMessage(msg); 这样写也没有绝得不好,反正当时项目...

WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)

好久没有写文章,发一篇顶顶博客访问量。别人建议转一些比较好的代码也贴过来,但是我打算这里主要发自己原创的代码,所以么。。流量该多少就多少吧。。。 回到主题,在webbrowser中点击某链接网上几乎都是用document对象模拟点击,这个方法基本能应对一般的情况,但是例如广告联盟的点击XXX就有检测机制(不多解释,你们懂的)。所以完全模拟鼠标的点击事件就比...

关于 spy++ 捕获消息

<00001> 00040AD2 S WM_SYSCOMMAND uCmdType:SC_MINIMIZE xPos:570 yPos:284 <00002> 00040AD2 R WM_SYSCOMMAND 00001  00002 其中 wParam 0000 F020   //0000 0000 0000 0000 111...

C#给其他程序发消息

1、相关声明函数,SendMessage可定义两种格式。 [DllImport("User32.DLL", CharSet = CharSet.Auto)]public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass,...