两个窗口之间发送数据
// 进程间发送数据
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hwnd, int msg, int wParam, ref COPYDATASTRUCT lParam);
// 找到窗口
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
// 发送消息的类型
const int WM_COPYDATA = 0x004A;
// 用作数据传递的结构体
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
// 发送数据
private void SendToAnotherProcess(byte[] data)
{
// 向另一个进程窗口发送
IntPtr hwnd = FindWindow(null, "窗口名称");
if (hwnd != IntPtr.Zero)
{
COPYDATASTRUCT cds;
cds.dwData = IntPtr.Zero; //可以是任意值
cds.cbData = data.Length; //指定lpData内存区域的字节数
cds.lpData = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, cds.lpData, data.Length); // 将字节数组复制到 COPYDATASTRUCT 结构体中
SendMessage(hwnd, WM_COPYDATA, 0, ref cds);
}
}
// 接收数据
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
InvByScannCode(ref m);
break;
default:
base.DefWndProc(ref m);//调用基类函数处理非自定义消息。
break;
}
}
private void InvByScannCode(ref System.Windows.Forms.Message m)
{
COPYDATASTRUCT cdata = new COPYDATASTRUCT();
Type mytype = cdata.GetType();
cdata = (COPYDATASTRUCT)m.GetLParam(mytype);
byte[] data = new byte[cdata.cbData]; // 复制字节数组数据
Marshal.Copy(cdata.lpData, data, 0, data.Length);
Console.WriteLine("接收数据{0}", BytesToHexString(data, 0, data.Length));
Receive(data);
}
//byte[]转16进制string
//0x13 0xab 0xef -> “13ABEF”
public static string BytesToHexString(byte[] bytes, int offset, int length)
{
string hexString = string.Empty;
if ((bytes != null) && (length != 0))
{
StringBuilder strB = new StringBuilder();
for (int i = offset; i < length + offset; i++)
{
strB.Append(bytes[i].ToString("X2"));
}
hexString = strB.ToString();
}
return hexString;
}