当前位置:首页>> 在Wince/WM实现进程间通信

在Wince/WM实现进程间通信

发布时间:2017-11-19作者:智汇小新

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

公司简介

宜科(天津)电子有限公司是中国工业自动化的领军企业,于2003年在天津投资成立,销售和服务网络覆盖全国。作为中国本土工业自动化产品的提供商和智能制造解决方案的供应商,宜科在汽车、汽车零部件、工程机械、机器人、食品制药、印刷包装、纺织机械、物流设备、电子制造等诸多领域占据领先地位。宜科为智慧工厂的整体规划实施提供自系统层、控制层、网络层到执行层自上而下的全系列服务,产品及解决方案涵盖但不局限于云平台、MES制造执行系统、工业现场总线、工业以太网、工业无线通讯、机器人及智能设备组成的自动化生产线、自动化电气控制系统集成、智能物流仓储系统等,以实现真正智能化的生产制造,从而带来生产力和生产效率的大幅提升,以及对生产灵活性和生产复杂性的管理能力的大幅提升。多年来,宜科以创新的技术、卓越的解决方案和产品坚持不懈地为中国制造业的发展提供全面支持,并以出众的品质和令人信赖的可靠性、领先的技术成就、不懈的创新追求,在业界独树一帜。帮助中国制造业转型升级,加速智能制造进程,成为中国工业4.0智慧工厂解决方案当之无愧的践行者。

更多详情>>

联系我们

  • 联系人:章清涛
  • 热线:18611695135
  • 电话:
  • 传真:
  • 邮箱:18210150532@139.com

Copyright © 2015 ilinki.net Inc. All rights reserved. 智汇工业版权所有

电话:010-62314658 邮箱:service@ilinki.net

主办单位:智汇万联(北京)信息技术有限公司

京ICP备15030148号-1