C#中使用SendMessage进行进程通信,可以发送字符串。
2015-05-14 11:55
603 查看
/// <summary>
/// 定义结构体
/// </summary>
public struct COPYDATASTRUCT
{
public IntPtr dwData; //可以是任意值
public int cbData; //指定lpData内存区域的字节数
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; //发送给目录窗口所在进程的数据
}
发送方:
[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;//必须是这个数值,不能更改
private void btnSend_Click(object sender, EventArgs e)
{
int hWnd = FindWindow(null, @"消息接受者");
if (hWnd == 0)
{
MessageBox.Show("未找到消息接受者!");
}
else
{
string sendString = "测试发送数据";
byte[] sarr = System.Text.Encoding.Default.GetBytes(sendString);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)0 ;
cds.cbData = len + 1;
cds.lpData = sendString;
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
}
}
接受方:
private static int WMA_InterPro = 0x004A;
protected override void DefWndProc(ref Message m)
{
if (m.Msg == WMA_InterPro)
{
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type t = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(t);
string
receiveInfo=cds.lpData;
}
else
{
base.DefWndProc(ref m);
}
}
/// 定义结构体
/// </summary>
public struct COPYDATASTRUCT
{
public IntPtr dwData; //可以是任意值
public int cbData; //指定lpData内存区域的字节数
[MarshalAs(UnmanagedType.LPStr)]
public string lpData; //发送给目录窗口所在进程的数据
}
发送方:
[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;//必须是这个数值,不能更改
private void btnSend_Click(object sender, EventArgs e)
{
int hWnd = FindWindow(null, @"消息接受者");
if (hWnd == 0)
{
MessageBox.Show("未找到消息接受者!");
}
else
{
string sendString = "测试发送数据";
byte[] sarr = System.Text.Encoding.Default.GetBytes(sendString);
int len = sarr.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)0 ;
cds.cbData = len + 1;
cds.lpData = sendString;
SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
}
}
接受方:
private static int WMA_InterPro = 0x004A;
protected override void DefWndProc(ref Message m)
{
if (m.Msg == WMA_InterPro)
{
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type t = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(t);
string
receiveInfo=cds.lpData;
}
else
{
base.DefWndProc(ref m);
}
}
相关文章推荐
- C#中使用SendMessage进行进程通信的实例
- C#中使用SendMessage进行进程通信的实例
- C#中使用命名管道进行进程通信的实例
- c# 使用SendMessage向另一进程发送WM_COPYDATA消息通信
- C#中使用命名管道进行进程通信的实例
- 控制台程序使用SendMessage进行进程间的通信
- 使用SendMessage方法对窗体上的控件进行截图,该方法的思想就是把控件的句柄拿到,对控件发送WM_PAINT消息,并且把希望得到图形对象的句柄当作wParam参数传过去,这样就可以在图形对象得到想要得图形。
- 如何:使用匿名管道在本地进程之间进行通信(C#)
- 使用命名管道通过网络在进程之间进行通信(C#)
- C#使用消息(SendMessage)进行跨进程操作
- C#使用命名管道通过网络在进程之间进行通信
- C#使用匿名管道在本地进程之间进行通信
- 在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现。 【方法一】:使用 try{} catch{} 语句。 我们可以在try语句块中试图
- c# 使用SendMessage向另一进程发送WM_COPYDATA消息通信 4000
- c#实现ajax通信:向后台发送JSON字符串,接收响应字符串,并转换为对象
- C#使用UdpClient发送和接收UDP数据示例 16进制与字符串互转
- 可以使用USB2.0接口进行全双工通讯么,双方都可以主动发送么?
- [Linux管道和IPC]使用信号量和共享内存进行父子进程通信
- [C#源代码]使用SCPI指令对通信端口(RS232/USB/GPIB/LAN)进行仪器编程
- 使用C#对字符串进行MD5加密