Wpf消息循环之消息传递
几天遇见一个问题需要检查某个wpf程序是否已经运行,如果没有运行则启动传递参数,如果已运行则需要直接传递消息。在没有运行 情况下传递参数很简单,我们只需要Process cmd窗口启动并传递参数,在程序中处理。但是如果程序已经启动有点麻烦,凭着我曾winform的经验第一时间想到的是win32 api SendMessage,我们的C#程序只需要DllImport就可以调用了。经过一番查找和对wpf window和DispatcherObject的Reflector,花了我大半天终于找到了System.Windows.Interop.HwndSource中有AddHock方法可以添加对win32消息机制的监听。这下就很好办了我们只需要注册MainWindow的这个时间,来监听win32消息处理我们的0x004A消息。
控制台代码,主要应用的FindWindow 这个win32方法查找我们的窗体,SendMessage发送我们的消息,和winform没有什么差别,对于win32的使用你可以参考毒龙的程序人生 的关于C#中实现两个应用程序消息通讯的问题。难得查win32 Api直接copy,借来用用。
程序:
- 查看代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Runtime.InteropServices;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- string ch = "";
- while (ch.ToLower() != "q")
- {
- if (!SendMessage("Window1", @"Hello,I am from Console Program:" + ch))
- {
- Console.WriteLine("no window");
- };
- ch = Console.ReadLine();
- }
- }
- public static bool SendMessage(string windowName, string strMsg)
- {
- if (strMsg == null) return true;
- IntPtr hwnd = (IntPtr)FindWindow(null, windowName );
- if (hwnd != IntPtr.Zero)
- {
- CopyDataStruct cds;
- cds.dwData = IntPtr.Zero;
- cds.lpData = strMsg;
- cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;
- int fromWindowHandler = 0;
- SendMessage(hwnd, 0x004A, fromWindowHandler, ref cds);
- return true;
- }
- return false;
- }
- [DllImport("User32.dll", EntryPoint = "FindWindow")]
- private static extern int FindWindow(string lpClassName, string lpWindowName);
- [DllImport("User32.dll", EntryPoint = "SendMessage")]
- private static extern int SendMessage
- (
- IntPtr hWnd,
- int Msg,
- int wParam,
- ref CopyDataStruct lParam
- );
- }
- [StructLayout(LayoutKind.Sequential)]
- public struct CopyDataStruct
- {
- public IntPtr dwData;
- public int cbData;
- [MarshalAs(UnmanagedType.LPStr)]
- public string lpData;
- }
- }
- 复制代码
wpf端程序:主要需要在MainWindow中loaded事件订阅消息监听:这里需要System.Windows.Interop.HwndSource的AddHock方法注册
程序:
- 查看代码
- IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
- {
- if (msg == 0x004A)
- {
- CopyDataStruct cds = (CopyDataStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(CopyDataStruct));
- MessageBox.Show(cds.lpData);
- this.Visibility = Visibility.Visible;
- }
- return hwnd;
- }
- private void Window_Loaded(object sender, RoutedEventArgs e)
- {
- (PresentationSource.FromVisual(this) as System.Windows.Interop.HwndSource).AddHook(new System.Windows.Interop.HwndSourceHook(WndProc));
- }
- 复制代码
截个图:
很简单的东西结果被MS封装的不知哪里去,让我查了半天(其实应该是我的无知吧,不管怎么解决了就是心情舒畅了);
转载于:https://blog.51cto.com/whitewolfblog/835234
Wpf消息循环之消息传递相关推荐
- MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)
注意:非模态和模态对话框都有自己的消息响应过程函数WindowPro,只不过他们的调用模态是自己的消息泵,非模态是由父窗体或父窗体的上一级的消息泵来调用.模态对话框和非模态对话框都可以通过SendMe ...
- 1.4 消息循环和回调函数
************************************************** * 本文由小鸟飞飞整理发表 <samboy@sohu.com> * * 首发网站:蓝丽 ...
- 理解MiniGUI消息循环和窗口过程
1.2 消息和消息循环 在Windows系列操作系统中,广泛使用了消息驱动的概念.在MiniGUI中,我们也使用了消息驱动作为应用程序的创建构架. 在消息驱动的应用程序中,计算机外设发生的事件,例如 ...
- Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...
- 异步IO(协程,消息循环队列)
同步是CPU自己主动查看IO操作是否完成,异步是IO操作完成后发出信号通知CPU(CPU是被通知的) 阻塞与非阻塞的区别在于发起IO操作之后,CPU是等待IO操作完成再进行下一步操作,还是不等待去做其 ...
- 应用程序进程(三):创建消息循环
1.在ActivityThread的main方法中开启主线程的消息循环 在其它线程中创建Looper可使用 Looper.prepare()方法 //ActivityThread#main publi ...
- android 结束if循环_Android Handler 消息循环机制
前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...
- 模态对话框和非模态对话框的消息循环
1.非模态对话框和父窗口共享当前线程的消息循环 2.模态对话框新建一个新的消息循环,并由当前消息循环派发消息,而父窗口.模态对话框屏蔽了用户对它父窗口的操作,但是不是在消息循环里面屏蔽,所以给父窗口发 ...
- android 消息循环机制--looper handler
Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结 ...
最新文章
- 【Linux+Mono+Asp.net公开课】视频下载
- RANSAC算法原理与实现
- ORACLE 分区表 PARTITION table
- MYSQL 时间处理
- 软件设计原则和方法通俗理解
- 隐藏桌面图标软件——CoverDesk for Mac免激活版
- 利用cloudera manager搭建Hadoop集群
- java 字符串截取_java截取字符串几种方式
- vue json对象转数组_vue-vue-router 快速了解,多看看能扎实基础
- zuc算法c需语言,ZUC算法原理及实现过程(20200921192330).pdf
- linux消息队列优缺点,linux消息队列概念
- 染色问题java_java地图路径染色寻找算法
- Keil:Undefined symbol ......(referred from......)
- 射影几何----极点极线割线共点四点调和定理
- mysql myisam转innodb_WordPressMySQL数据库MyISAM表转换InnoDB方法和修复工具
- shadow:人工智能设计,一门自己生长的课
- error:The calling thread cannot access this object because a different thread owns it解决方法
- 函数原型中int *arr和int arr[]
- 百度JS实现文本语音朗读
- Matlab图像处理基础(一)图像类型的转换
热门文章
- 什么是三层交换机、网关、DNS、子网掩码、MAC地址
- ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
- Docker mongo副本集环境搭建
- Confluence 6 创建小组的公众空间
- 寻找隐形冠军 支付宝、微信用得那么溜,可谁知道背后有一名“上海功臣
- Asp.Net Core写个共享磁盘文件Web查看器
- 互联网企业安全高级指南3.7.1 攻防驱动修改
- 获取在线APP的素材图片
- 阿里员工离职潮的背后?
- 3.1 A Historical Perspective 历史观点