中文字幕视频在线免费_日韩在线精品_日韩视频免费看_中文字幕在线三区_午夜免费视频_日韩在线大片

在Wince/WM實現進程間通信

來源:網絡

點擊:1824

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

    (審核編輯: 智匯小新)

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

    主站蜘蛛池模板: 99精品在线观看 | 一级电影免费在线观看 | 国内精品视频在线观看 | 久久精品久久综合 | 欧美一级特黄视频 | 精品欧美日韩 | 91精品国产综合久久久久久漫画 | 中文字幕视频 | 欧美在线免费观看 | 国产综合在线播放 | 噜噜噜噜狠狠狠7777视频 | 国产一区二区av | 欧美一级二级三级 | 99视频网站| 无码一区二区三区视频 | 午夜影院免费 | 一区二区三区视频免费在线观看 | 精品成人免费一区二区在线播放 | 日日操视频 | 99国产精品久久久 | 怡红院在线播放 | 免费看a| 久久综合伊人 | 国产黄色av | 国产精品欧美一区二区三区 | 国产中文字幕一区 | 亚洲在线电影 | 91国产精品 | 久久精品一 | 色婷婷一区二区三区 | 国产一区免费 | 欧美中文字幕一区二区三区亚洲 | 欧美精品亚洲 | 美女视频一区二区三区 | 日日干,天天干 | 久一在线 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精选一区二区 | 久久99精品久久久久久噜噜 | a在线观看| 久久一二区 |