现在的位置: 首页 > 综合 > 正文

API两个程序间信息的传送与接收,一方发送另一方自动接收.

2017年11月06日 ⁄ 综合 ⁄ 共 2836字 ⁄ 字号 评论关闭

1、发送消息

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace Set_Get_Messages
{
    class APISendMsg
    {
        const int WM_COPYDATA = 0x004A;

        //将指定的消息发送到一个或多个窗口
        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        private static extern long SendMessage(IntPtr hwnd, Int32 msg, Int32 hwndFrom, ref COPYDATASTRUCT cd);
        //查找窗体
        [DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]
        private static extern IntPtr FindWindow(String classname, String text);

        [StructLayout(LayoutKind.Sequential)]
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;//目标
            public int cbData;//数据长度
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;//消息
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="strMSG">消息</param>
        public void sendMsg(string strMSG)
        {
            string s = strMSG;
            //定义c,是为了取得字符串中一些非英文字符的长度,比如一个中文,占两个字长。            
            int c = StrLength(s);
            IntPtr hTraceWnd = FindWindow(null, "获得信息窗口");//查找窗口时要注意,单独查找类与查找名称都不可靠。
            if (hTraceWnd != IntPtr.Zero)
            {
                Int32 id = 1;         // magic number for
                Int32 WM_COPYDATA = 0x004A;    // Win32 API message id
                COPYDATASTRUCT cd = new COPYDATASTRUCT();
                cd.dwData = (IntPtr)id;
                cd.lpData = s + "/0";//一定要加上结束标志,不加的话会得到不确定的字符。
                cd.cbData = s.Length + c + 1;//另外加上双字节的东西和结束符的长度
                SendMessage(hTraceWnd, WM_COPYDATA, 0, ref cd);
            }

        }
        /// <summary>
        /// 字符串长度(按字节算)
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private int StrLength(string str)
        {
            int len = 0;
            byte[] b;

            for (int i = 0; i < str.Length; i++)
            {
                b = Encoding.Default.GetBytes(str.Substring(i, 1));//每个字
                if (b.Length > 1)
                    len += 2;
                else
                    len++;
            }

            return len;
        }
    }
}

 

2、接收消息

const int WM_COPYDATA = 0x004A;
        [StructLayout(LayoutKind.Sequential)]
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
        //接收消息
        protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                //接收自定义消息 USER,并显示其参数
                case WM_COPYDATA:
                    COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                    Type mytype = mystr.GetType();

                    mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
                    this.richTextBox1.Text = mystr.lpData;
                   
                    break;
                default:
                    base.DefWndProc(ref m);
                    break;

            }

        }

 

抱歉!评论已关闭.