none
如何用WM_COPYDATA实现进程间通信?(最好能贴点代码) RRS feed

答案

  • 你好:

    发送消息的函数

       /// <summary>

            /// 通过 SendMessage 向指定句柄发送数据

            /// </summary>

            /// <param name="hWnd">接收方的窗口句柄</param>

            /// <param name="dwData">附加数据</param>

            /// <param name="lpdata">发送的数据</param>

            public static int SendCopyData(IntPtr hWnd, int dwData, byte[] lpdata)

            {

                COPYDATASTRUCT cds = new COPYDATASTRUCT();

                cds.dwData = (IntPtr)dwData;

                cds.cbData = lpdata.Length;

                cds.lpData = Marshal.AllocHGlobal(lpdata.Length);

                Marshal.Copy(lpdata, 0, cds.lpData, lpdata.Length);

                IntPtr lParam = Marshal.AllocHGlobal(Marshal.SizeOf(cds));

                Marshal.StructureToPtr(cds, lParam, true);

     

                int result = 0;

                try

                {

                    result = SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, lParam);

                }

                finally

                {

                    Marshal.FreeHGlobal(cds.lpData);

                    Marshal.DestroyStructure(lParam, typeof(COPYDATASTRUCT));

                    Marshal.FreeHGlobal(lParam);

                }

                return result;

        }

    在接收方的类,需要从能够接收消息的类(从Control继承的类都可以)继承,然后重写WndProc方法,重写代码如下:

            protected override void WndProc(ref Message m)

            {

                if (m.Msg == WindowsApi.WM_COPYDATA)

                {

                    int dwData;

                    byte[] lpData;

                    WindowsApi.ReceivCopyData(ref m, out dwData, out lpData);

                    // 这里为你的处理代码。。。

                }

                else

                {

                    base.WndProc(ref m);

                }

        }

    下面是接收函数 ReceivCopyData 的代码:

                 /// <summary>

            /// 获取消息类型为 WM_COPYDATA 中的数据

            /// </summary>

            /// <param name="m"></param>

            /// <param name="dwData">附加数据</param>

            /// <param name="lpdata">接收到的发送数据</param>

            public static void ReceivCopyData(ref Message m, out int dwData, out byte[] lpdata)

            {

                COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));

                dwData = cds.dwData.ToInt32();

                lpdata = new byte[cds.cbData];

                Marshal.Copy(cds.lpData, lpdata, 0, cds.cbData);

                m.Result = (IntPtr)0;

        }

    请参照http://www.cnblogs.com/xuneng/archive/2009/08/11/1543715.html

    希望对你有所帮助。

    2010年9月6日 6:53
    版主

全部回复

  • 这个问题在这里已经被提到多次,请搜索类似问题寻找解决方案。如果仍然没有找到方案,请届时再提问。谢谢。
    Mark Zhou
    2010年9月3日 9:07
  • 可以看看这篇文章“使用Windows API实现两个进程间(含窗体)的通信 ”(http://blog.csdn.net/huangxinfeng/archive/2010/04/21/5513608.aspx
    2010年9月3日 13:29
  • 你好:

    发送消息的函数

       /// <summary>

            /// 通过 SendMessage 向指定句柄发送数据

            /// </summary>

            /// <param name="hWnd">接收方的窗口句柄</param>

            /// <param name="dwData">附加数据</param>

            /// <param name="lpdata">发送的数据</param>

            public static int SendCopyData(IntPtr hWnd, int dwData, byte[] lpdata)

            {

                COPYDATASTRUCT cds = new COPYDATASTRUCT();

                cds.dwData = (IntPtr)dwData;

                cds.cbData = lpdata.Length;

                cds.lpData = Marshal.AllocHGlobal(lpdata.Length);

                Marshal.Copy(lpdata, 0, cds.lpData, lpdata.Length);

                IntPtr lParam = Marshal.AllocHGlobal(Marshal.SizeOf(cds));

                Marshal.StructureToPtr(cds, lParam, true);

     

                int result = 0;

                try

                {

                    result = SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, lParam);

                }

                finally

                {

                    Marshal.FreeHGlobal(cds.lpData);

                    Marshal.DestroyStructure(lParam, typeof(COPYDATASTRUCT));

                    Marshal.FreeHGlobal(lParam);

                }

                return result;

        }

    在接收方的类,需要从能够接收消息的类(从Control继承的类都可以)继承,然后重写WndProc方法,重写代码如下:

            protected override void WndProc(ref Message m)

            {

                if (m.Msg == WindowsApi.WM_COPYDATA)

                {

                    int dwData;

                    byte[] lpData;

                    WindowsApi.ReceivCopyData(ref m, out dwData, out lpData);

                    // 这里为你的处理代码。。。

                }

                else

                {

                    base.WndProc(ref m);

                }

        }

    下面是接收函数 ReceivCopyData 的代码:

                 /// <summary>

            /// 获取消息类型为 WM_COPYDATA 中的数据

            /// </summary>

            /// <param name="m"></param>

            /// <param name="dwData">附加数据</param>

            /// <param name="lpdata">接收到的发送数据</param>

            public static void ReceivCopyData(ref Message m, out int dwData, out byte[] lpdata)

            {

                COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));

                dwData = cds.dwData.ToInt32();

                lpdata = new byte[cds.cbData];

                Marshal.Copy(cds.lpData, lpdata, 0, cds.cbData);

                m.Result = (IntPtr)0;

        }

    请参照http://www.cnblogs.com/xuneng/archive/2009/08/11/1543715.html

    希望对你有所帮助。

    2010年9月6日 6:53
    版主
  • 你好:

    发送消息的函数

       /// <summary>

            /// 通过 SendMessage 向指定句柄发送数据

            /// </summary>

            /// <param name="hWnd">接收方的窗口句柄</param>

            /// <param name="dwData">附加数据</param>

            /// <param name="lpdata">发送的数据</param>

            public static int SendCopyData(IntPtr hWnd, int dwData, byte[] lpdata)

            {

                COPYDATASTRUCT cds = new COPYDATASTRUCT();

                cds.dwData = (IntPtr)dwData;

                cds.cbData = lpdata.Length;

                cds.lpData = Marshal.AllocHGlobal(lpdata.Length);

                Marshal.Copy(lpdata, 0, cds.lpData, lpdata.Length);

                IntPtr lParam = Marshal.AllocHGlobal(Marshal.SizeOf(cds));

                Marshal.StructureToPtr(cds, lParam, true);

     

                int result = 0;

                try

                {

                    result = SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, lParam);

                }

                finally

                {

                    Marshal.FreeHGlobal(cds.lpData);

                    Marshal.DestroyStructure(lParam, typeof(COPYDATASTRUCT));

                    Marshal.FreeHGlobal(lParam);

                }

                return result;

        }

    在接收方的类,需要从能够接收消息的类(从Control继承的类都可以)继承,然后重写WndProc方法,重写代码如下:

            protected override void WndProc(ref Message m)

            {

                if (m.Msg == WindowsApi.WM_COPYDATA)

                {

                    int dwData;

                    byte[] lpData;

                    WindowsApi.ReceivCopyData(ref m, out dwData, out lpData);

                    // 这里为你的处理代码。。。

                }

                else

                {

                    base.WndProc(ref m);

                }

        }

    下面是接收函数 ReceivCopyData 的代码:

                 /// <summary>

            /// 获取消息类型为 WM_COPYDATA 中的数据

            /// </summary>

            /// <param name="m"></param>

            /// <param name="dwData">附加数据</param>

            /// <param name="lpdata">接收到的发送数据</param>

            public static void ReceivCopyData(ref Message m, out int dwData, out byte[] lpdata)

            {

                COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));

                dwData = cds.dwData.ToInt32();

                lpdata = new byte[cds.cbData];

                Marshal.Copy(cds.lpData, lpdata, 0, cds.cbData);

                m.Result = (IntPtr)0;

        }

    请参照http://www.cnblogs.com/xuneng/archive/2009/08/11/1543715.html

    希望对你有所帮助。

    时间过那么久了,也不见楼主出来说明测试的如何,只见到取消标记答案
    秘訣無它,唯勤而已
    2010年10月10日 14:44