使用SendMessage方法(发送消息与接收消息)
发送方代码:
namespace CacheData
{
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
public static class WinInfo
{
public const int WM_COPYDATA = 0x004A;
public const int WM_COPYIMGDATA = 0x004B;
[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);
//发送消息到进程(方式一)
public static int SendMsgToProcess(string winName, byte[] msg, CmdUdpModes cmdCode)
{
int res = 0;
GCHandle handle = GCHandle.Alloc(msg, GCHandleType.Pinned);
try
{
IntPtr lParam = Marshal.UnsafeAddrOfPinnedArrayElement(msg, 0);
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)msg[2];//命令码
cds.cbData = msg.Length;//指定lpData内存区域的字节数
cds.lpData = lParam;
var hanl1 = FindWindow(null, winName);
res = SendMessage(hanl1, WM_COPYDATA, 0, ref cds);
}
catch (Exception ex)
{
LogHelper.Error("SendMsgToProcess exception. " + ex.Message);
Console.WriteLine("SendMsgToProcess exception." + ex.Message);
}
finally
{
handle.Free();
}
return res;
}
//发送消息到进程(方式二)
public static int SendMsgToProcess11(string winName, byte[] message, CmdUdpModes cmdCode)
{
int res = 0;
try
{
int len = message.Length;
COPYDATASTRUCT cds;
cds.dwData = (IntPtr)message[2];//命令码
cds.cbData = len;//指定lpData内存区域的字节数
IntPtr iPtr = Marshal.AllocHGlobal(message.Length);
Marshal.Copy(message, 0, iPtr, message.Length);
cds.lpData = iPtr;
var hanl = FindWindow(null, winName);
int result = SendMessage(hanl, WM_COPYIMGDATA, 0, ref cds);
//释放非托管内存
Marshal.FreeCoTaskMem(iPtr);
}
catch (Exception ex)
{
LogHelper.Error("SendMsgToProcess exception. " + ex.Message);
Console.WriteLine("SendMsgToProcess exception." + ex.Message);
}
return res;
}
}
}
接收方代码:
protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
try
{
if (!isDefWndProc) break;
COPYDATASTRUCT cds = new COPYDATASTRUCT();
Type mytype = cds.GetType();
cds = (COPYDATASTRUCT)m.GetLParam(mytype);
uint flag = (uint)cds.dwData;
byte[] buffer = new byte[cds.cbData];
var str = cds.lpData;
Marshal.Copy(cds.lpData, buffer, 0, buffer.Length);
string strName = System.Text.Encoding.UTF8.GetString(buffer);
//RefreshImg(strName);
}
catch (Exception ex)
{
ErrMessageManager.WriteErr(ex);
m.Result = (IntPtr)1;
}
break;
default:
base.DefWndProc(ref m);
break;
}
}