1、发送消息
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Set_Get_Messages
{
class APISendMsg
{
const int WM_COPYDATA = 0x004A;
//将指定的消息发送到一个或多个窗口
[DllImport("user32.dll", EntryPoint = "SendMessage")]
private static extern long SendMessage(IntPtr hwnd, Int32 msg, Int32 hwndFrom, ref COPYDATASTRUCT cd);
//查找窗体
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow(String classname, String text);
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;//目标
public int cbData;//数据长度
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;//消息
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="strMSG">消息</param>
public void sendMsg(string strMSG)
{
string s = strMSG;
//定义c,是为了取得字符串中一些非英文字符的长度,比如一个中文,占两个字长。
int c = StrLength(s);
IntPtr hTraceWnd = FindWindow(null, "获得信息窗口");//查找窗口时要注意,单独查找类与查找名称都不可靠。
if (hTraceWnd != IntPtr.Zero)
{
Int32 id = 1; // magic number for
Int32 WM_COPYDATA = 0x004A; // Win32 API message id
COPYDATASTRUCT cd = new COPYDATASTRUCT();
cd.dwData = (IntPtr)id;
cd.lpData = s + "/0";//一定要加上结束标志,不加的话会得到不确定的字符。
cd.cbData = s.Length + c + 1;//另外加上双字节的东西和结束符的长度
SendMessage(hTraceWnd, WM_COPYDATA, 0, ref cd);
}
}
/// <summary>
/// 字符串长度(按字节算)
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private int StrLength(string str)
{
int len = 0;
byte[] b;
for (int i = 0; i < str.Length; i++)
{
b = Encoding.Default.GetBytes(str.Substring(i, 1));//每个字
if (b.Length > 1)
len += 2;
else
len++;
}
return len;
}
}
}
2、接收消息
const int WM_COPYDATA = 0x004A;
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
//接收消息
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
//接收自定义消息 USER,并显示其参数
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
this.richTextBox1.Text = mystr.lpData;
break;
default:
base.DefWndProc(ref m);
break;
}
}