窗口之间传递消息的一个方法

news/2024/7/5 5:13:20

发送窗口的代码

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, // messageint wParam, // first message parameterref 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, // messageint wParam, // first message parameterref 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接收窗口的代码

 

 

转载于:https://www.cnblogs.com/pdfw/archive/2012/03/01/2375798.html


http://lihuaxi.xjx100.cn/news/279656.html

相关文章

XPath 节点概述

XPath 是一门在 XML 文档中查找信息的语言。XPath 术语 节点 在 XPath 中&#xff0c;有七种类型的节点&#xff1a;元素、属性、文本、命名空间、处理指令、注释以及文档&#xff08;根&#xff09;节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。…

手把手教你学单片机,学完马上能自己编写开发程序

大家好&#xff0c;我是无际单片机编程的徐老师&#xff0c;今天给大家分享一下51单片机学习。 给大家分享一下怎么学习单片机&#xff0c;同时给大家推荐相应的学习课程。 学习单片机&#xff0c;我们要分几个步骤&#xff1a; 第一步&#xff1a;买一个学习开发板&#xf…

【SpringMVC】与权限拦截器冲突导致的Cors跨域设置失效问题

问题描述 前端域名FE.com向后端域名BE.com分别请求访问优惠券的列表和提交新增的优惠券&#xff0c;API设计所用的Method分别为Get和Post&#xff0c;结果为前一次访问成功而后一次访问失败。这两次请求都是跨域请求&#xff0c;其中请求1包含一个Get请求&#xff0c;请求2本应…

酷炫 | 比较6种类型和14种数据可视化工具

作者 | 神秘的铁头娃来源 | FineReport编译 | AI算法与图像处理&#xff08;ID&#xff1a;AI_study&#xff09;【导读】随着大数据时代的降临&#xff0c;企业和组织对数据的需求发生变化&#xff0c;因此五花八门的可视化工具开始层出不穷。那么面对这么多的可视化工具&…

单片机学不会怎么办?单片机从哪里开始学?

大家好&#xff0c;我是无际单片机编程的徐导。 说起单片机学不会怎么办&#xff1f;就想起我自己一些学习的辛酸史。 我做单片机开发10余年了&#xff0c;单片机硬软件开发自然是很熟练了。 但做其他的工作可是一窍不通&#xff0c;在上家公司工作的时候&#xff0c;公司有…

Linux 技巧:让进程在后台可靠运行的几种方法

想让进程在断开连接后依然保持运行&#xff1f;如果该进程已经开始运行了该如何补救&#xff1f; 如果有大量这类需求如何简化操作&#xff1f; 我们经常会碰到这样的问题&#xff0c;用 telnet/ssh 登录了远程的 Linux 服务器&#xff0c;运行了一些耗时较长的任务&#xff0c…

Spring Cloud Alibba教程:Sentinel的使用

点击上方“方志朋”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;什么是SentinelSentinel&#xff0c;中文翻译为哨兵&#xff0c;是为微服务提供流量控制、熔断降级的功能&#xff0c;它和Hystrix提供的功能一样&#xff0c;可以有效的解决微服务调用产生的…

入机器学习大坑,需要什么样的数学水平?

选自medium作者&#xff1a;Benjamin Obi Tayo机器之心编译 参与&#xff1a;小舟、杜伟作为一门基础性学科&#xff0c;数学在数据科学和机器学习领域都发挥着不可或缺的作用。数学基础是理解各种算法的先决条件&#xff0c;也将帮助我们更深入透彻地了解算法的内在原理。所以…