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)=>
            {
                Win32Message m = (Win32Message)Marshal.PtrToStructure(iparam, typeof(Win32Message));
                action?.Invoke(m.lpData);
                return IntPtr.Zero;
            });
        }

        #endregion

原文地址:https://www.cnblogs.com/nocanstillbb/p/10488511.html

时间: 2024-10-10 10:04:01

Wpf发送接收 win32消息的相关文章

Spring使用MappingJackson2MessageConverter发送接收ActiveMQ消息

一.Spring使用JmsTemplate简化对JMS的访问 在JAVA对JMS队列访问中,使用默认的JMS支持将存在大量的检查型异常.通过Spring的支持,可以将所有的JMS的检查型异常转换为运行时非检查异常.以及在Spring中,通过配置JMSConnectionFactory的DefaultDestinationName指定发送和接收目的地. 下面是ActiveMQ的连接factory配置: 1 @Bean 2 public ActiveMQConnectionFactory getAM

[3] MQTT,mosquitto,Eclipse Paho---如何使用 Eclipse Paho MQTT工具来发送订阅MQTT消息?

在上两节,笔者主要介绍了 MQTT,mosquitto,Eclipse Paho的基本概念已经如何安装mosquitto. 在这个章节我们就来看看如何用 Eclipse Paho MQTT工具来发送接收MQTT消息.Eclipse Paho MQTT工具是一个基于Java的Eclipse桌面客户端程序,其底层的和MQTT服务器进行的交互的java类库就是Eclipse Paho java库.假设我们在本机(127.0.0.1)已经启动了一个mosquitto MQTT服务器,其端口为1883.如

【Spring】使用Spring和AMQP发送接收消息(上)

讲AMQP之前,先讲下传统的JMS的消息模型,JMS中主要有三个参与者:消息的生产者.消费者.传递消息的通道(队列或者主题),两种消息模型如下:通道是队列: 通道是队列: 通道是主题: 在JMS中,虽然通道有助于解耦消息的生产者和消费者,但这两者依然会与通道相耦合.生产者会将消息发布到一个特定的队列或主题上,消费者从特定的队列或主题上接收这些消息,通道具有双重责任,就是传递数据和确定这些消息该发送到什么地方,队列的话会使用点对点算法发送,主题的话就使用发布-订阅方式.而使用AMQP的话,生产者并

SpringBoot整合RabbitMQ之发送接收消息实战

实战前言 前几篇文章中,我们介绍了SpringBoot整合RabbitMQ的配置以及实战了Spring的事件驱动模型,这两篇文章对于我们后续实战RabbitMQ其他知识要点将起到奠基的作用的.特别是Spring的事件驱动模型,当我们全篇实战完毕RabbitMQ并大概了解一下RabbitMQ相关组件的源码时,会发现其中的ApplicationEvent.ApplicationListener.ApplicationEventPublisher跟RabbitMQ的Message.Listener.R

解决Springboot整合ActiveMQ发送和接收topic消息的问题

环境搭建 1.创建maven项目(jar) 2.pom.xml添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> &l

Java Socket发送与接收HTTP消息简单实现

在上次Java Socket现实简单的HTTP服务我 们实现了简单的HTTP服务,它可以用来模拟HTTP服务,用它可以截获HTTP请求的原始码流,让我们很清楚的了解到我们向服务发的HTTP消息的结 构,对HTTP请求消息有个清晰的认识.这一节我想写了一个客户的程序,就是用来模拟浏览器,用来向服务器发送HTTP请求,最得要的是可以用它来显示服 务器发回来的HTTP响应消息的一般结构. [java] view plaincopy import java.io.IOException; import 

Win32消息循环机制等【转载】http://blog.csdn.net/u013777351/article/details/49522219

Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序.虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构. 而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程

【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息 /// 截获消息 处理XP不能关机问题 protected override void WndProc(ref Message message) { switch (message.Msg) { case WM_QUERYENDSESSION: isClosed = true; break; } base.WndProc(ref message); } #endregion window

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值

C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息        /// 截获消息  处理XP不能关机问题        protected override void WndProc(ref Message message)        {            switch (message.Msg)            {                case WM_QUERYENDSESSION: