WinCE 在C#里用SendMessage发送结构对象[转]

来源:互联网 发布:淘宝数据采集软件 编辑:程序博客网 时间:2024/06/05 19:28

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);
    }

原创粉丝点击