1 先定义一个消息接类,因为CE里的Form是不支持消息的
class MsgWindow:MessageWindow
{
private IMessage _msgWnd;
public IMessage MsgWnd
{
get { return _msgWnd; }
set { _msgWnd = value; }
}
public MsgWindow(IMessage MsgWnd)
{
this.MsgWnd = MsgWnd;
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x004A:
CopyData mystr = new CopyData();
//在这可以把整个Message对象交给实现了接口的类,让他自己转换,因为这是测试,所以为了方便才这在处理
//byte[] bytes=new byte[4];
//Marshal.Copy(m.LParam, bytes, 0, 4);
mystr=(CopyData)Marshal.PtrToStructure(m.LParam, typeof(CopyData));
MsgWnd.GetMessage(m.WParam.ToInt32(), mystr);
break;
default:
base.WndProc(ref m);
break;
}
}
}
2 消息发送 发送到的句柄是消息接收类的句柄
Message msg= new Message();
msg.HWnd=this.MsgHandle;
msg.WParam =(IntPtr) 10;
msg.Msg = 0x004A;
CopyData cd = new CopyData();
//cd.ServiceName = "服务名";
cd.hwnd = 100 ;
cd.ServiceName = "终于得了吧";
msg.LParam = IntPtr.Zero;
int size = Marshal.SizeOf(cd);
IntPtr c = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(cd, c, false);
msg.LParam = c;
MessageWindow.SendMessage(ref msg);
3 用于两者传送的结构也要如下定义,因为CE是全面用Unicode的,所以字符串要为Unicode
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public unsafe struct CopyData
{
public const int WM_COPYDATA = 0x004A;
[MarshalAs(UnmanagedType.I4,SizeConst=4)]
public int hwnd;
[MarshalAs(UnmanagedType.LPWStr,MarshalType="string")]
public string ServiceName;
[MarshalAs(UnmanagedType.I4,SizeConst=4)]
public int i;
[MarshalAs( UnmanagedType.I4,SizeConst=4)]
public int j;
}
public interface IMessage //这是接收消息类所要实现的接口
{
//void GetMessage(ref Message msg);
void GetMessage(int LPARAM, CopyData lpData);
}