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接收窗口的代码
  • 相关阅读:
    HTML5之画布的拖拽/拖放
    HDU 4028 The time of a day STL 模拟题
    java 使用htmlunit模拟登录爬取新浪微博页面
    【java.lang.UnsupportedClassVersionError】版本不一致出错
    Unsupported major.minor version 52.0
    java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal问题解决
    htmlunit抓取js执行后的网页源码
    Maven添加本地依赖
    htmlunit爬取js异步加载后的页面
    HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
  • 原文地址:https://www.cnblogs.com/pdfw/p/2375798.html
Copyright © 2011-2022 走看看