using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
/// <summary>
/// Windows 的COPYDATA消息封装类。
/// </summary>
public class Messager : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
//消息标识
private const int WM_COPYDATA = 0x004A;
//消息数据类型(typeFlag以上二进制,typeFlag以下字符)
private const uint typeFlag = 0x8000;
/// <summary>
/// 重载CopyDataStruct
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
ref COPYDATASTRUCT lParam // second message parameter
);
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string lpWindowName);
// 接收到数据委托与事件定义
public delegate void ReceiveStringEvent(object sender, uint flag, string str);
public delegate void ReceiveBytesEvent(object sender, uint flag, byte[] bt);
public event ReceiveStringEvent OnReceiveString;
public event ReceiveBytesEvent OnReceiveBytes;
// 发送数据委托与事件定义
public delegate void SendStringEvent(object sender, uint flag, string str);
public delegate void SendBytesEvent(object sender, uint flag, byte[] bt);
public event SendStringEvent OnSendString;
public event SendBytesEvent OnSendBytes;
public Messager()
{
InitializeComponent();
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// Messager
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(342, 242);
this.Name = "Messager";
this.ShowInTaskbar = false;
this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 重载窗口消息处理函数
/// </summary>
/// <param name="m"></param>
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
// 接收CopyData消息,读取发送过来的数据
case WM_COPYDATA:
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type mytype = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(mytype);
uint flag = (uint)(cds.dwData);
byte[] bt = new byte[cds.cbData];
Marshal.Copy(cds.lpData, bt, 0, bt.Length);
if (flag <= typeFlag)
{
if (OnReceiveString != null)
{
OnReceiveString(this, flag, System.Text.Encoding.Default.GetString(bt));
}
}
else
{
if (OnReceiveBytes != null)
{
OnReceiveBytes(this, flag, bt);
}
}
break;
default:
base.DefWndProc(ref m);
break;
}
}
/// <summary>
/// 发送字符串格式数据
/// </summary>
/// <param name="destWindow">目标窗口标题</param>
/// <param name="flag">数据标志</param>
/// <param name="str">数据</param>
/// <returns></returns>
public bool SendString(string destWindow, uint flag, string str)
{
if (flag > typeFlag)
{
MessageBox.Show("要发送的数据不是字符格式");
return false;
}
int WINDOW_HANDLER = FindWindow(null, @destWindow);
if (WINDOW_HANDLER == 0) return false;
try
{
byte[] sarr = System.Text.Encoding.Default.GetBytes(str);
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)flag;
cds.cbData = sarr.Length;
cds.lpData = Marshal.AllocHGlobal(sarr.Length);
Marshal.Copy(sarr, 0, cds.lpData, sarr.Length);
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
if (OnSendString != null)
{
OnSendString(this, flag, str);
}
return true;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return false;
}
}
/// <summary>
/// 发送二进制格式数据
/// </summary>
/// <param name="destWindow">目标窗口</param>
/// <param name="flag">数据标志</param>
/// <param name="data">数据</param>
/// <returns></returns>
public bool SendBytes(string destWindow, uint flag, byte[] data)
{
if (flag <= typeFlag)
{
MessageBox.Show("要发送的数据不是二进制格式");
return false;
}
int WINDOW_HANDLER = FindWindow(null, @destWindow);
if (WINDOW_HANDLER == 0) return false;
try
{
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)flag;
cds.cbData = data.Length;
cds.lpData = Marshal.AllocHGlobal(data.Length);
Marshal.Copy(data, 0, cds.lpData, data.Length);
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
if (OnSendBytes != null)
{
OnSendBytes(this, flag, data);
}
return true;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return false;
}
}
}