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. ...
随机推荐
- 【HAOI 2008】 糖果传递
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1045 [算法] 环形均分纸牌问题 [代码] #include<bits/std ...
- frameset的target属性
使用frameset时的target属性 (2012-09-18 08:19:31) 转载▼ 分类: java技术之路 一般常用的有四个属性 _blank 浏览器总在一个新打开.未命名的窗口中载入 ...
- 9.28NOIP模拟题
9.28NOIP模拟题 题目 哈 哈哈 哈哈哈 英文题目与子目录名 ha haha hahaha 单个测试点时间限制 1秒 1秒 1秒 内存限制 256M 128M 64M 测试点数目 10 10 1 ...
- Oracle group by分组拼接字符串
select wm_concat(id),depon from test_1 group by depon
- jmeter关联、下载文件、简单压测
关联 一.什么是关联 关联是请求与请求之间存在数据依赖关系,需要从上一个请求获取下一个请求需要回传回去的数据. 简单地说就是在测试过程中有些数据的值会经常发生变化,要获取并使用这些数据,把这个动态的信 ...
- webview加载本地页面
main.xml中布局webview,activity中设置如下 MyWebView=(WebView)findViewById(R.id.webView1); MyWebView.requestFo ...
- JSP 向 JavaScript 中传递数组
采用隐藏标签的方式: // JSP: <% while(rs.next()) { %> <in ...
- android 虚拟机,文件导入sdcard下报错,Read-only file system
解决方案-------------------- eclipse -> windows->Android AVD Manager 里选择你的AVD,edit里SD Card 选择File, ...
- linux命令大杂烩之网络管理
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具. 作为一款强力 ...
- [转]Window2008站点安全设置,IIS7/IIS7.5中目录执行权限的设置方法
本文转自:http://blog.snsgou.com/post-510.html 最近帮一个朋友管理Window 2008服务器,发现有个站点是用asp写的,更可怕的是还有传说中的“上传漏洞”,在上 ...