zoukankan      html  css  js  c++  java
  • 窗口之间传递消息的一个方法

    发送窗口的代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;
    
    namespace WpfSendMsg
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            const int WM_COPYDATA = 0x004A;
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(
                int hWnd, // handle to destination BR>            
                int Msg, // message
                int wParam, // first message parameter
                ref COPYDATASTRUCT lParam // second message parameter
            );
    
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int Find(string lpClassName, string lpame);
    
            public Window1()
            {
                InitializeComponent();
                this.Title = "SentWindow";
            }
    
            private void btn1_Click(object sender, RoutedEventArgs e)
            {
                //int HANDLER = Findnull, @"欲发送程序窗口的标题");
                int HANDLER = Find(null, @"WindowGet");
                if (HANDLER != 0)
                {
                    byte[] sarr = System.Text.Encoding.Default.GetBytes(tb1.Text);
                    int len = sarr.Length;
                    COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)100;
                    cds.lpData = tb1.Text;
                    cds.cbData = len + 1;
                    SendMessage(HANDLER, WM_COPYDATA, 0, ref cds);
                }
            }
        }
    
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
    }
    发送窗口的代码
     
    如果接收窗口是wpf的窗口,代码如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;
    using System.Windows.Interop;
    
    namespace GetMsg
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            const int WM_COPYDATA = 0x004A;
    
            public Window1()
            {
                InitializeComponent();
                this.Title = "WindowGet";
                SourceInitialized += AppWindow_SourceInitialized;
            }
    
            private void AppWindow_SourceInitialized(object sender, EventArgs e)
            {
                WindowInteropHelper helper = new WindowInteropHelper(this);
    
                HwndSource hwndSource = HwndSource.FromHwnd(helper.Handle);
                hwndSource.AddHook(new HwndSourceHook(WndProc));
                
            }
    
    
            IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                int retVal = 0;
                handled = false;
    
                switch ((int)msg)
                {
                    case WM_COPYDATA:
                        {
                            
                            try
                            {
                                COPYDATASTRUCT cp = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
                                
                                tb1.Text = cp.lpData;
                            }
                            catch (Exception e)
                            {
                                System.Diagnostics.Debug.WriteLine(e.ToString());
                            }
                            handled = true;
                            retVal = 1;
    
                            break;
                        }
                    default:
                        break;
                }
    
                return (IntPtr)retVal;
            }
    
            public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }
    
    
        }
    }
    wpf接收窗口的代码

    如果接收窗口是winform的窗口,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Runtime.InteropServices;
    
    namespace WpfSendMsg
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            const int WM_COPYDATA = 0x004A;
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(
                int hWnd, // handle to destination BR>            
                int Msg, // message
                int wParam, // first message parameter
                ref COPYDATASTRUCT lParam // second message parameter
            );
    
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int Find(string lpClassName, string lpame);
    
            public Window1()
            {
                InitializeComponent();
                this.Title = "SentWindow";
            }
    
            private void btn1_Click(object sender, RoutedEventArgs e)
            {
                //int HANDLER = Findnull, @"欲发送程序窗口的标题");
                int HANDLER = Find(null, @"WindowGet");
                if (HANDLER != 0)
                {
                    byte[] sarr = System.Text.Encoding.Default.GetBytes(tb1.Text);
                    int len = sarr.Length;
                    COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)100;
                    cds.lpData = tb1.Text;
                    cds.cbData = len + 1;
                    SendMessage(HANDLER, WM_COPYDATA, 0, ref cds);
                }
            }
        }
    
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
    }
    WinForm接收窗口的代码
  • 相关阅读:
    C#导出数据—使用Word模板书签的使用
    C#动态调用泛型类、泛型方法
    C#中运算符的介绍和使用
    C#中自定义类型转换
    Linux删除文件后没有释放空间
    Linux下用dd命令测试硬盘的读写速度
    强制关闭或重启Linux系统的几种方法
    前端使用a标签启动本地.exe程序
    Linux 命令别名,让alias永久生效
    Linux 自动删除N小时或分钟前的文件
  • 原文地址:https://www.cnblogs.com/pdfw/p/2375798.html
Copyright © 2011-2022 走看看