智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

在Wince/WM實現進程間通信

來源:網絡

點擊:1895

A+ A-

所屬頻道:新聞中心

關鍵詞: Wince/WM,進程通信

    做WM上的進程間通信,使用WindowMessage實現兩個進程間的通信,感覺MessageWindow不太好用,所以就用別的方法實現接收WindowsMessage。

    先來封裝一下需要使用的功能,命名為Cls_Message:

    view plaincopy to clipboardprint?
    using System;  
    using System.Collections.Generic;  
    using System.Text;  
    using System.Runtime.InteropServices;  
    using Microsoft.WindowsCE.Forms;  
    using System.Windows.Forms;  
    class Cls_Message  
    {  
        private struct COPYDATASTRUCT  
        {  
            public int dwData;  
            public int cbData;  
            public IntPtr lpData;  
        }  
        //-------------------------------------------------------------------------------  
        private const int WM_COPYDATA = 0x004A;  
        private const int GWL_WNDPROC = -4;  
        private const int LMEM_FIXED = 0x0000;  
        private const int LMEM_ZEROINIT = 0x0040;  
        private const int LPTR = (LMEM_FIXED | LMEM_ZEROINIT);  
        private  IntPtr oldWndProc = IntPtr.Zero;  
        private  WndProcDelegate newWndProc;  
        private IntPtr formHandle;  
        //-------------------------------------------------------------------------------  
        delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);  
        [DllImport("coredll.dll")]  
        static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);  
        [DllImport("coredll.dll", EntryPoint = "GetWindowLong")]  
        private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);  
        [DllImport("coredll.dll")]  
        static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newWndProc);  
        [DllImport("coredll.dll", EntryPoint = "FindWindow")]  
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  
        [DllImport("coredll.dll")]  
        private static extern int SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);  
        [DllImport("coredll.dll")]  
        private static extern IntPtr LocalAlloc(int flag, int size);  
        [DllImport("coredll.dll")]  
        private static extern IntPtr LocalFree(IntPtr p);  
        /// <summary>  
        /// 初始化消息類  
        /// </summary>  
        /// <param name="handle">接受消息的窗體的句柄</param>  
        public Cls_Message(IntPtr formHandle)  
        {  
            this.formHandle = formHandle;  
            newWndProc = new WndProcDelegate(WndProc);  
            oldWndProc = GetWindowLong(formHandle, GWL_WNDPROC);  
            int success = SetWindowLong(formHandle, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));  
        }  
        /// <summary>  
        /// 消息處理  
        /// </summary>  
        private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)  
        {  
            if (msg == WM_COPYDATA)  
            {  
                COPYDATASTRUCT st = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));  
                string str = Marshal.PtrToStringUni(st.lpData);  
                MessageBox.Show(str);  
            }  
            return CallWindowProc(oldWndProc, this.formHandle, msg, wParam, lParam);  
        }  
          
        static private IntPtr AllocHGlobal(int cb)  
        {  
            IntPtr hMemory = new IntPtr();  
            hMemory = LocalAlloc(LPTR, cb);  
            return hMemory;  
        }  
        static private void FreeHGlobal(IntPtr hMemory)  
        {  
            if (hMemory != IntPtr.Zero)  
                LocalFree(hMemory);  
        }  
        /// <summary>  
        /// 發送消息  
        /// </summary>  
        /// <param name="formTitle">目標窗體的名稱</param>  
        /// <param name="message">消息內容</param>  
        static public void SendMessage(String formTitle,String message)  
        {  
            IntPtr hWndDest = FindWindow(null, formTitle);  
            COPYDATASTRUCT oCDS = new COPYDATASTRUCT();  
            oCDS.cbData = (message.Length + 1) * 2;  
            oCDS.lpData = LocalAlloc(LPTR, oCDS.cbData);  
            Marshal.Copy(message.ToCharArray(), 0, oCDS.lpData, message.Length);  
            oCDS.dwData = 1;  
            IntPtr lParam = AllocHGlobal(oCDS.cbData);  
            Marshal.StructureToPtr(oCDS, lParam, false);  
            SendMessageW(hWndDest, WM_COPYDATA, IntPtr.Zero, lParam);  
            LocalFree(oCDS.lpData);  
            FreeHGlobal(lParam);  
        }  

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using Microsoft.WindowsCE.Forms;
    using System.Windows.Forms;
    class Cls_Message
    {
        private struct COPYDATASTRUCT
        {
            public int dwData;
            public int cbData;
            public IntPtr lpData;
        }
        //-------------------------------------------------------------------------------
        private const int WM_COPYDATA = 0x004A;
        private const int GWL_WNDPROC = -4;
        private const int LMEM_FIXED = 0x0000;
        private const int LMEM_ZEROINIT = 0x0040;
        private const int LPTR = (LMEM_FIXED | LMEM_ZEROINIT);
        private  IntPtr oldWndProc = IntPtr.Zero;
        private  WndProcDelegate newWndProc;
        private IntPtr formHandle;
        //-------------------------------------------------------------------------------
        delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
        [DllImport("coredll.dll")]
        static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
        [DllImport("coredll.dll", EntryPoint = "GetWindowLong")]
        private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);
        [DllImport("coredll.dll")]
        static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr newWndProc);
        [DllImport("coredll.dll", EntryPoint = "FindWindow")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("coredll.dll")]
        private static extern int SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
        [DllImport("coredll.dll")]
        private static extern IntPtr LocalAlloc(int flag, int size);
        [DllImport("coredll.dll")]
        private static extern IntPtr LocalFree(IntPtr p);
        /// <summary>
        /// 初始化消息類
        /// </summary>
        /// <param name="handle">接受消息的窗體的句柄</param>
        public Cls_Message(IntPtr formHandle)
        {
            this.formHandle = formHandle;
            newWndProc = new WndProcDelegate(WndProc);
            oldWndProc = GetWindowLong(formHandle, GWL_WNDPROC);
            int success = SetWindowLong(formHandle, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProc));
        }
        /// <summary>
        /// 消息處理
        /// </summary>
        private IntPtr WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
        {
            if (msg == WM_COPYDATA)
            {
                COPYDATASTRUCT st = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
                string str = Marshal.PtrToStringUni(st.lpData);
                MessageBox.Show(str);
            }
            return CallWindowProc(oldWndProc, this.formHandle, msg, wParam, lParam);
        }
       
        static private IntPtr AllocHGlobal(int cb)
        {
            IntPtr hMemory = new IntPtr();
            hMemory = LocalAlloc(LPTR, cb);
            return hMemory;
        }
        static private void FreeHGlobal(IntPtr hMemory)
        {
            if (hMemory != IntPtr.Zero)
                LocalFree(hMemory);
        }
        /// <summary>
        /// 發送消息
        /// </summary>
        /// <param name="formTitle">目標窗體的名稱</param>
        /// <param name="message">消息內容</param>
        static public void SendMessage(String formTitle,String message)
        {
            IntPtr hWndDest = FindWindow(null, formTitle);
            COPYDATASTRUCT oCDS = new COPYDATASTRUCT();
            oCDS.cbData = (message.Length + 1) * 2;
            oCDS.lpData = LocalAlloc(LPTR, oCDS.cbData);
            Marshal.Copy(message.ToCharArray(), 0, oCDS.lpData, message.Length);
            oCDS.dwData = 1;
            IntPtr lParam = AllocHGlobal(oCDS.cbData);
            Marshal.StructureToPtr(oCDS, lParam, false);
            SendMessageW(hWndDest, WM_COPYDATA, IntPtr.Zero, lParam);
            LocalFree(oCDS.lpData);
            FreeHGlobal(lParam);
        }
    }
     


    接下來貼出調用代碼,實現自發自收,如果要發給別的進程,只需要把SendMessage的第一個參數改為目標窗體的名稱即可(當然目標窗體也必須引用了Cls_Message實現收信息處理):

    view plaincopy to clipboardprint?
    Cls_Message clsMessage;//初始化  
    public Form1()  
    {  
        InitializeComponent();  
    }  
    private void Form1_Load(object sender, EventArgs e)  
    {  
        clsMessage = new Cls_Message(this.Handle);//使本窗體能夠接收WindowMessage  
    }  
    private void button1_Click(object sender, EventArgs e)  
    {  
        Cls_Message.SendMessage("Form1", "hello form1");  

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    主站蜘蛛池模板: 南开大学在职研究生招生信息网| 深圳奥力特化工产品有限公司企业网站| 健身器材_健身器材厂_健身器材厂家-徐州兰士健身器材有限公司 | 中派康明斯发电机_玉柴发电机厂家_静音移动拖车发电机-深圳市斯坦福电力设备有限公司 | 驾驶扫地机-手推洗地机-吸尘器-清洁设备厂家-荣事达官网 | 专题秀_汇聚网络热门专题_实时报道各类新闻专题资讯 | 深圳沃亚游学官网丨国外游学丨国际夏冬令营丨美国游学线路丨出国短期游学丨亲子海外游丨游学咨询: 0755-83843308 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 智能门锁管理-公寓管理软件-智能水电表管理系统-深圳安安智能 | 乐云SEO | 品牌营销:抖音小红书关键词优化-ai搜索优化GEO推广 | 专注客流统计,客流分析,人流统计系统,客流计数器-广州市天威电子科技有限公司 | 土石_泥石分离机_无轴滚筒筛_振动筛 - 巩义市鑫利重工机械制造有限公司 | 液压升降机_导轨式电动液压升降平台_别墅电梯生产厂家-海南重康升降机 | 小程序开发,网站建设,APP开发,商城系统开发,社区团购系统开发,区块链溯源,互联网资质办理-软多信息技术有限公司_河南软多信息技术有限公司 | 明基太阳能玻璃钢污水处理公司-设计研发全自动加药装置设备 | 山东优科机械设备有限公司,养鸡设备,湿帘设备,通风降温加湿设备,山东养鸡设备,山东湿帘设备 | 深圳市佳顺优印印刷有限公司,佳顺优印,画册印刷,海报印刷,封套印刷,手提袋印刷,包装盒印刷,彩盒印刷,无碳纸印刷,不干胶印刷,信封印刷,便笺印刷,笔记本印刷,台历印刷,挂历印刷,国际会展中心附近印刷厂,宝安印刷厂,宝安教材印刷厂 | 铜陵耐火砖|铜陵耐火浇注料|铜陵耐火材料|铜陵市金钟物资经营部【官网】 | 四氟瓶塞-塑料离心机-双联恒温水浴锅-常州天瑞仪器有限公司 | 珠海市甜菊科技发展有限公司| 吉林省新思路教育发展有限公司 | 起名字典|宝宝新生儿男孩女孩起名免费网-诗经周易生辰八字取名字大全 | 拉力机|拉力试验机|拉力测试机厂家-苏州天氏库力精密仪器有限公司 | 葫芦岛市鹏翔农药化工科技有限公司-苦参碱可溶液剂-氯氰菊酯乳油-阿维菌素乳油 | 液压油缸生产厂家-常州辰佰液压机械有限公司 | 金蝶软件_金蝶湖南公司_长沙金蝶软件_精斗云软件_财务软件_进销存软件_云ERP软件_金蝶软件销售电话 | 江门市金环电器有限公司| 模具|数控加工-车床加工-精密数控铣床-东莞市方菱精密模具有限公司专注零件及模具加工 | 上海视研装饰工程有限公司-上海标识公司,上海标识设计 | 宁波搬家_宁波搬家公司_宁波搬厂_专业搬家搬厂-「宁波喜洋洋搬家公司」 | 以物联网技术为核心专注于智能安防领域物联网服务的高新技术企业-北京欣智恒科技股份有限公司(官网) | 紫外线光疗仪|白癜风光疗仪|牛皮癣治疗仪|308纳米led|SIGMA|上海希格玛高技术有限公司 | 上海视研装饰工程有限公司-上海标识公司,上海标识设计 | 透明捆扎带_束带机打包带_束带机纸带_热封纸带机_上海得亿束带机包装材料有限公司 | 绝缘油介电强度测试仪|d33压电测试仪|准静态d33压电测量仪厂家直销-上海蓝巢电气有限公司【官网】 | 实验室超纯水机-超纯水机-超纯水仪-上海赫恩实业有限公司 | 开拓者喷雾设备有限公司专业生产喷嘴,喷雾设备,清洗,喷涂,降温,除尘,润滑等喷雾系统的方案解决商 | 三机一体除湿干燥机,色母机,称重式拌料机,工业冻水机,中央集中供料-东莞市瑞达机械科技有限公司(瑞达国际) | 新2025澳门天天开好彩生肖对照表,2025新澳精准正版免费,2025新澳今晚开奖资料大全,新澳门四肖期期准免费,新澳门今晚9点30分开奖结果 | 郑州课桌椅|学生课桌椅|升降课桌椅批发|厂家|价格-新科教育用品 郑州井盖雨水篦子厂家-建联建材 | 欧艺宝盾科技(北京)有限责任公司_北京旋转门厂家_转门维修_高端商务门控定制 - |