zoukankan      html  css  js  c++  java
  • Wpf发送接收 win32消息

    #region WPF发送和接收win32消息
            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;
    
            public struct Win32Message
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs (UnmanagedType.LPStr)]
                public string lpData;
            }
    
            [DllImport("user32.dll")]
            private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref Win32Message lParam);
    
            /// <summary>
            /// 返回wpf主窗体句柄
            /// </summary>
            /// <param name="processName">wpf进程名</param>
            /// <returns></returns>
            public static IntPtr  GetWpfMainwindowHandel(string processName)
            {            
                return Process.GetProcesses().FirstOrDefault(t => t.ProcessName.Contains(processName))?.MainWindowHandle??IntPtr.Zero;
            }
            /// <summary>
            /// 发送win32消息给wpf窗口
            /// </summary>
            /// <param name="wpfWinHandel">窗口句柄</param>
            /// <param name="message">字符串消息</param>
            public static void SendWin32MessageToWpfWindow(IntPtr wpfWinHandel,string message )
            {
                if (wpfWinHandel != IntPtr.Zero)
                {
                    var param = new Win32Message
                    {
                        dwData = (IntPtr)100,
                        cbData = System.Text.Encoding.Default.GetBytes(message).Length,
                        lpData = message,
                    };
                    SendMessage(wpfWinHandel, WM_COPYDATA, 0, ref param);
                }
                else
                {
                    Console.WriteLine("wpf窗口句柄为zero");
                }
            }
    
            /// <summary>
            /// wpf窗口订阅win32消息
            /// </summary>
            /// <param name="window">wpf窗口</param>
            /// <param name="action">接收到win32消息时要处理的action</param>
            public static void SubWin32Message(System.Windows.Window window,Action<string> action)
            {
                WindowInteropHelper win = new WindowInteropHelper(window);
                HwndSource hwndSource = HwndSource.FromHwnd(win.Handle);
                hwndSource.AddHook((IntPtr hwnd,int msg,IntPtr wparam,IntPtr iparam,ref bool handel)=>
                {
              if ( msg ==
    WM_COPYDATA )
              {
                 Win32Message m = (Win32Message)Marshal.PtrToStructure(iparam, typeof(Win32Message));
                action
    ?.Invoke(m.lpData);
              }
             
    return IntPtr.Zero;
           });
         }

    #endregion
  • 相关阅读:
    如何下载无水印的抖音视频?
    @valid和自定义异常
    Centos7查看外网ip,yum安装的curl无法正常使用
    ElasticSearch安装
    Redis的主从架构+哨兵模式
    Redis的持久化方式
    Nacos 注册中心集群搭建
    kafka安装流程
    WinUI 3学习笔记(1)—— First Desktop App
    .NET 5学习笔记(12)——WinUI 3 Project Reunion 0.5
  • 原文地址:https://www.cnblogs.com/nocanstillbb/p/10488511.html
Copyright © 2011-2022 走看看