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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值