C# WPF 无窗体传递消息
WPF如果存在窗体(或至少,在任务栏有图标显示),互相传递消息是很容易的。
寻找目标窗体句柄->WindowsAPI SendMessage/PostMessage->目标窗体AddHook。参见:C# WPF 窗体传递消息
但是,如果窗体不存在,比如说,最小化的时候仅显示一个tray icon,连任务栏的图标都不能用,这个流程就不管用了。因为此时无法获取到目标窗体的句柄。
到达到这个要求,还有几种不同的方法:
1.管道。因为就在本机传递消息,所以匿名管道/命名管道都可以满足要求;
2.TCP/UDP 如果仅仅是传递一些特定的约定好的少数信息的话,这有点杀鸡用牛刀的感觉;
3.Windows API: PostThreadMessage
本文介绍第三种方法:
示例目标:程序只能运行一个实例,当程序再次被启动,就通知已经运行的实例并且关闭自身进程
1.判断/获取已经运行的实例
跟上一篇博文一样的代码一样……
2.注册WindowsAPI
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostThreadMessage(int threadId, uint msg, IntPtr wParam, IntPtr lParam);
3.修改App.OnStartup方法
public const uint WM_APP = 0x9112;//0x8001~0xBFFF; protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e); Process targetProcess = GetCurrentExeProcess(); if (targetProcess!=null)//Software has been running...
{
if (targetProcess.Threads.Count > )
{
int targetMainThreadID=targetProcess.Threads[].Id; bool result=SingleExeHelper.PostThreadMessage(targetMainThreadID, WM_APP, IntPtr.Zero, IntPtr.Zero);
} Environment.Exit();//Software has been running, close this
}
else
{
ComponentDispatcher.ThreadPreprocessMessage += ComponentDispatcher_ThreadPreprocessMessage;
}
} private void ComponentDispatcher_ThreadPreprocessMessage(ref MSG msg, ref bool handled)
{
int m = (int)App.WM_APP;
if (msg.message == m)
{
System.Windows.MessageBox.Show("收到信息啦!!!!");
}
}
因为没有窗体了,所以在App.OnStartup方法注册收到消息的处理方法。
参考文章:
How can I register a global hot key to say CTRL+SHIFT+(LETTER) using WPF and .NET 3.5?
C# WPF 无窗体传递消息的更多相关文章
- WPF无边框捕获消息改变窗口大小
原文:WPF无边框捕获消息改变窗口大小 文章大部分转载自http://blog.csdn.net/fwj380891124,如有问题,请联系删除 最近一直在学习 WPF,看着别人做的WPF程序那么漂 ...
- C# WPF 窗体传递消息
对于存在窗体的WPF程序(或者说,起码在任务栏上有个图标,即ShowInTaskbar = true),互相传递消息是很容易的. 步骤: 1,寻找窗体的句柄 2,运用windows API: Send ...
- WPF向系统发送消息 并传递结构体
场景 :需要开发一个通讯组件 流程为:界面-开启接收服务-通过发送组件发送信息到 其他客户端和服务端 接受服务接收其他客户端发送的消息 需要传递给对应组件或者界面 因此会出现类库重复引用问题.因为采用 ...
- WPFの无边框窗体以及控件的移动
对于WPF,一旦隐藏了标题栏,就无法移动,这时候需要重写移动方法,下面列举常见的三种方式方式. 方式一:重写OnMouseLeftButtonDown protected override void ...
- wpf无边框窗体移动和大小调整
原文:wpf无边框窗体移动和大小调整 using System; using System.Windows; using System.Windows.Interop; namespace Wpf ...
- WPF实现无窗体鼠标跟随
原文:WPF实现无窗体鼠标跟随 上次的弹力模拟动画实现后,我觉得可以把这个弄得更好玩一些,我们可以让小球实时跟随着鼠标,并且还可以让窗口完全消失,让小球在桌面上飞来飞去. 这只需要一些简单的修改就可以 ...
- C# .net WPF无边框移动窗体
转自 http://download.csdn.net/detail/xiang348352/3095084 WPF无边框移动窗体,先在<Window>里添加 MouseLeftButto ...
- WPF无边框移动窗体
WPF无边框移动窗体,先在<Window>里添加 MouseLeftButtonDown=”Window_MouseLeftButtonDown” 然后导航到事件,在事件里添加 if (e ...
- javascript跨域传递消息 / 服务器实时推送总结
参考文档,下面有转载[非常好的两篇文章]: http://www.cnblogs.com/loveis715/p/4592246.html [跨源的各种方法总结] http://kb.cnblogs. ...
随机推荐
- 【POJ 2689】 Prime Distance
[题目链接] http://poj.org/problem?id=2689 [算法] 我们知道,一个在区间[l,r]中的合数的最小质因子必然不超过sqrt(r) 那么,先暴力筛出1-50000中的质数 ...
- B1007 [HNOI2008]水平可见直线 几何
其实就是一道很简单的栈,只要明白什么情况会被挡住就行了.假如斜率一样则下面的被挡住,假如不一样就算交点,看那个交点在上面就行了. 题干: Description 在xoy直角坐标平面上有n条直线L1, ...
- Poj2054 color a tree && [HNOI/AHOI2018]排列
https://zybuluo.com/ysner/note/1120723 题面 原题 某省选强化题 大致意思是给你一颗树,选父亲后才能选儿子. 每个点对答案的贡献为你在第几次选这个点 × 该点权值 ...
- POJ 3268 最短路应用
POJ3268 题意很简单 正向图跑一遍SPFA 反向图再跑一边SPFA 找最大值即可. #include<iostream> #include<cstdio> #includ ...
- Scala 方法接受变参
def Parametron(strings:String*): Unit ={ strings.foreach(x=>{ println(x) ") println(s"* ...
- java普通代码块、静态代码块、默认构造方法的执行顺序
package test; class Parent{ { System.out.println("父类普通代码块"); } static{ System.out.println( ...
- BZOJ DZY Loves Math系列
⑤(BZOJ 3560) $\Sigma_{i_1|a_1}\Sigma_{i_2|a_2}\Sigma_{i_3|a_3}\Sigma_{i_4|a_4}...\Sigma_{i_n|a_n}\ph ...
- tomcat解决 java.lang.IllegalArgumentException: Request header is too large
tomcat运行项目时,有一个请求过去后,后台报这样的错java.lang.IllegalArgumentException: Request header is too large 原因:请求头超过 ...
- vim之tags
好长时间没有上来更新了, 今天趁老板不再上来休闲一下. 本章要说的是和vim的tags相关的内容. 之所以在跳转之后就说明tags是因为这个功能相当的重要和实用. 好的东西自然是需要提前分享的. 首先 ...
- MyEclipse中VSS的使用详解
本文系转载,原文地址http://hi.baidu.com/yi88cheng/blog/item/13dd862f765e6b5c4fc226e5.html