zoukankan      html  css  js  c++  java
  • 使用copydata实现进程之间数据传递

    Winform to Winfrom==>

    发送端==》

    using System;
    using System.Runtime.InteropServices;
    
    namespace CopyData.Sender
    {
        public partial class Form1 : System.Windows.Forms.Form
        {
            const int WM_COPYDATA = 0x004A;
            public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(
                int hWnd, // handle to destination window
                int Msg, // message
                int wParam, // first message parameter
                ref COPYDATASTRUCT lParam // second message parameter
            );
    
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string
                lpWindowName);
    
            private void button1_Click(object sender, System.EventArgs e)
            {
                int WINDOW_HANDLER = FindWindow(null, @"Form1");
                if (WINDOW_HANDLER == 0)
                {
                }
                else
                {
                    byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);
                    int len = sarr.Length;
                    COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)100;
                    cds.lpData = this.textBox1.Text;
                    cds.cbData = len + 1;
                    SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
                }
            }
        }
    }
    

    接收端==》

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace CopyData.Receiver
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            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.textBox1.Text = mystr.lpData;
    
                        break;
                    default:
                        base.DefWndProc(ref m);
                        break;
                }
            }
        }
    
       
    }
    

    运行效果如下:

    注意:

    int WINDOW_HANDLER = FindWindow(null@"Form1"); —— 用于确定发送方发送数据到其他进程的某个标题为Form1的窗体。

    2.delhpi程序与C#程序进行消息发送时,出现如下问题,解决思路?

    a.安装.netframework

    b.检查delphi以及C#程序(例如,delphi==>cdds.cbData := length(Edit1.Text)+1;cdds.lpData := pchar(Edit1.Text);)是否正确?

    WPF to Winfrom to WPF==>

    发送方: WPF to WinFrom

    private void QueueCode(int queueType)
            {
                IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(this)).Handle;
                int sendHandle = hwnd.ToInt32();
                int WINDOW_HANDLER = FindWindow(null, @"Form1");
                if (WINDOW_HANDLER == 0)
                {
                    StartQueueExe();
                    WINDOW_HANDLER = FindWindow(null, @"Form1");
                }
    
                string queueName = this.cbQueue.Text;
                queueName = queueType + "^" + this.cbQueue.Text + "^" + sendHandle;
                if (WINDOW_HANDLER == 0) { }
                else
                {
                    byte[] sarr = System.Text.Encoding.Default.GetBytes(queueName);
                    int len = sarr.Length;
                    COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)100;
                    cds.lpData = queueName;
                    cds.cbData = len + 1;
                    SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
                }
    
                var hwndSource = (HwndSource)HwndSource.FromVisual(this);
                hwndSource.AddHook(new HwndSourceHook(WndProc));
            }
    
            private void StartQueueExe()
            {
                string filePath = AppDomain.CurrentDomain.BaseDirectory + "TEST.exe";
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = filePath;
                p.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动
                p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
                p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
                p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
                p.StartInfo.CreateNoWindow = true;//不显示程序窗口
                p.Start();//启动程序
                Thread.Sleep(500);
            }
    
            private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                switch (msg)
                {
                    case WM_COPYDATA:
                        COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                        Type mytype = mystr.GetType();
                        COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal
                            .PtrToStructure(lParam, typeof(COPYDATASTRUCT));
                        this.lblQueueMessage.Content = cds.lpData;
                        break;
                    default: break;
                }
                return (System.IntPtr)0;
            }

     接收方:WinFrom获取

      #region 获取消息
            /// <summary>
            /// 0x004A
            /// </summary>
            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)
            {
                try
                {
                    switch (m.Msg)
                    {
                        //  接收自定义消息 USER,并显示其参数
                        case WM_COPYDATA:
                            COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                            Type mytype = mystr.GetType();
                            mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
                            ReceiveMessage = mystr.lpData;
                            break;
                        default:
                            base.DefWndProc(ref m);
                            break;
                    }
                }
                catch { return; }
            }
    
            #endregion
    

    Winfrom to WPF

       private static string FormTitle = "Form1";
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(
                int hWnd, // handle to destination window
                int Msg, // message
                int wParam, // first message parameter
                ref COPYDATASTRUCT lParam // second message parameter
            );
    
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string lpWindowName);
    
    public bool SendMessage(int value, int queueType)
            {
                try
                {
                    StringBuilder content = new StringBuilder();
                    if (value != 0)//没有全部被预约
                    {
                        // string appointTimes = DateTime.Now.ToLongTimeString().ToString();
                        if (string.IsNullOrEmpty(CurrentDate)) CurrentDate = DateTime.Now.ToShortDateString();
                        int num = DBQSQueueBusiness.GetCountByCondition(QueueId, CurrentDate);
    
                        CurrentDate = DateTime.Parse(CurrentDate).ToString("yyyy-MM-dd");
                        content.Append(CurrentDate);//日期
                        content.Append("^");
                        content.Append(CurrentTimePart);//描述appointTimes
                        content.Append("^");
                        content.Append(value);//号
                        content.Append("^");
                        content.Append(QueueId);//队列
                        content.Append("^");
    
                        if (queue == null) queue = new V_Queue();
                        queue.ENROLDATE = CurrentDate;
                        queue.APPOINTTIME = CurrentTimePart;//appointTimes
                        queue.SORTNO = value;
                    }
                    else content.Append("0");
    
                    //int WINDOW_HANDLER = FindWindow(null, @FormTitle);
                    int WINDOW_HANDLER = int.Parse(FormTitle);
                    if (WINDOW_HANDLER == 0) { }
                    else
                    {
                        byte[] sarr = System.Text.Encoding.Default.GetBytes(content.ToString());
                        int len = sarr.Length;
                        COPYDATASTRUCT cds;
                        cds.dwData = (IntPtr)100;
                        cds.lpData = content.ToString();
                        cds.cbData = len + 1;
                        SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);
                    }
                }
                catch { return false; }
                return true;
            }
    

    WPF 接收方:

     #region 定义常量消息值
            public const int WM_GETTEXT = 0x0D;
            public const int WM_SETTEXT = 0x0C;
            public const int WM_SIZEING = 0x0214;
            public const int WM_COPYDATA = 0x004A;
            public const int WM_LBUTTONDBLCLK = 0x0203;
            #endregion
    
            #region 定义结构体
           public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }
            #endregion
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                HwndSource hWndSource;
                WindowInteropHelper wih = new WindowInteropHelper(this);
                hWndSource = HwndSource.FromHwnd(wih.Handle);
                //添加处理程序 
                hWndSource.AddHook(Test);
            }
            private IntPtr Test(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                switch (msg)
                {
                  
                    case WM_COPYDATA:
                        {
    
                            COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                            Type mytype = mystr.GetType();
    
                            COPYDATASTRUCT MyKeyboardHookStruct = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
                             this.textbox.Text = MyKeyboardHookStruct.lpData;
                            break;
    
                        }
                         default:
                        {
                                 break;
                        }
    
    
                }
                return IntPtr.Zero;
            }
    

      

  • 相关阅读:
    RAID介绍,RAID5,10制作与损坏恢复
    ELK 安装过程
    centos 系统 yum安装软件报错
    linux系统磁盘分区
    python实现遍历两个文件夹,比对文件异常,生成比对报告功能
    win10新装系统,显卡风扇转动,链接正常开机,但设备管理器如果显示,无法更新驱动
    navicat premium 破解,无限试用方法
    安装vmware workstations 12 +ubuntu 遇到的一些问题
    win10 如何打开telnet,ftp等服务
    linux集群架构-keepalived高可用
  • 原文地址:https://www.cnblogs.com/YYkun/p/7001839.html
Copyright © 2011-2022 走看看