程序异常退出后,托盘残留图标清理方法(C#)
程序猿对于宕机再熟悉不过了,如果一个程序异常退出,那我们只能在Windows日志中找到它的踪迹;如果它是一个托盘程序,异常退出后,它会停留在托盘中久久不能离去,直到我们的鼠标从它身上划过;如果一个程序被另一个守护程序不断的杀掉、重启,那么它的结果会如下图所示,

请注意!!这不是扫雷!!没错,这正是残留的图标。解决方法其实很简单,在程序每次开启前,向托盘窗口发送鼠标经过消息WM_MOUSEMOVE,使其刷新。
首先要明确一点,托盘包括显示区域和溢出区域,所以需要同时刷新,防止遗漏。可以用Spy++鼠标右键选择“突出显示”,窗口轮廓就会闪烁,SysPager和NotifyIconOverflowWindow。

代码如下:
using System;
using System.Runtime.InteropServices; public class TaskBarUtil
{
struct RECT
{
public int left, top, right, bottom;
} public static void RefreshNotification()
{
var NotifyAreaHandle = GetNotifyAreaHandle();
if (NotifyAreaHandle != IntPtr.Zero)
RefreshWindow(NotifyAreaHandle); var NotifyOverHandle = GetNotifyOverHandle();
if (NotifyOverHandle != IntPtr.Zero)
RefreshWindow(NotifyOverHandle);
} private static void RefreshWindow(IntPtr windowHandle)
{
const uint WM_MOUSEMOVE = 0x0200;
RECT rect;
GetClientRect(windowHandle, out rect);
for (var x = 0; x < rect.right; x += 5)
for (var y = 0; y < rect.bottom; y += 5)
SendMessage(windowHandle, WM_MOUSEMOVE, 0, (y << 16) + x);
} private static IntPtr GetNotifyAreaHandle()
{
var TrayWndHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", string.Empty);
var TrayNotifyWndHandle = FindWindowEx(TrayWndHandle, IntPtr.Zero, "TrayNotifyWnd", string.Empty);
var SysPagerHandle = FindWindowEx(TrayNotifyWndHandle, IntPtr.Zero, "SysPager", string.Empty);
var NotifyAreaHandle = FindWindowEx(SysPagerHandle, IntPtr.Zero, "ToolbarWindow32", string.Empty); return NotifyAreaHandle;
} private static IntPtr GetNotifyOverHandle()
{
var OverHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "NotifyIconOverflowWindow", string.Empty);
var NotifyOverHandle = FindWindowEx(OverHandle, IntPtr.Zero, "ToolbarWindow32", string.Empty); return NotifyOverHandle;
} [DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
[DllImport("user32.dll")]
static extern bool GetClientRect(IntPtr handle, out RECT rect);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr handle, UInt32 message, Int32 wParam, Int32 lParam);
}
TaskBarUtil.RefreshNotification();
托盘又恢复往日简洁 ^_^
程序异常退出后,托盘残留图标清理方法(C#)的更多相关文章
- C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题
问题背景 C#小白,由于本公司IM系统服务端(java)是本人独立开发的,加上现在所在项目需要对接IM系统,于是IM的客户端(C#实现)对接工作就交给我了.于是C#小白的我天真的以为只要调用C#端的S ...
- 空闲时间研究一个小功能:winform桌面程序如何实现动态更换桌面图标
今天休息在家,由于天气热再加上疫情原因,就在家里呆着,空闲时想着,在很早以前(约3年前),产品人员跟我提了一个需求,那就是winform桌面程序的图标能否根据节日动态更换,这种需求在移动APP上还是比 ...
- C# 程序异常关闭时的捕获
本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以 ...
- C#WinForm程序异常退出的捕获、继续执行与自动重启
本文参考网上搜索的信息,并做了适当修改可以让捕捉到异常之后阻止程序退出. 另给出了通过命令行自动重启的方法. 如果一个线程里运行下面的代码 ; / a; 将会导致程序自动结束,而且没有任何提示信息 但 ...
- iOS程序闪退的原因以及处理办法
iOS程序闪退是一种比较常见的现象.闪退的情况很多,造成程序闪退的原因也很多. ================================启动时闪退======================= ...
- 程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验
1,程序异常崩溃后用windbg辅助调试解决的经验 状况:我的程序调用别人的库做 文件写入工作. 在这一过程中出现异常,程序崩溃. 经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错. ...
- 在DevExpress程序中使用内置的图标构建美观的界面元素
在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...
- C# 程序异常管理方案
C# 程序异常管理方案 1.程序出现未处理异常(程序中未捕获异常.添加异常处理) 2.程序添加全局异常捕获 tip:程序已处理异常不在捕获范围内. /// <summary> /// 应用 ...
- AIX系统程序异常不释放光驱处理
AIX操作系统有时会出现程序异常不释放光驱,可以用以下命令进行处理: #fuser -kxuc /dev/cd0 或者 #fuser /dev/cd0 以上命令会列出访问光驱设备的所有进程,然后使用k ...
- asp.net网站后台退出后,点后退按钮仍能进,如何安全退出
用户登录成功后,将用户名保存Session Session["usrename"]=username; 退出后Sessssion["username"]=str ...
随机推荐
- Pod原理以及Pod生命周期
一.Pod的介绍 1.为什么需要Pod? 假设 Kubernetes 中调度的基本单元就是容器,对于一个非常简单的应用可以直接被调度直接使用,没有什么问题,但是往往还有很多应用程序是由多个进程组成的, ...
- Java IO<1>File类
java.io.File类 文件和文件目录路径的抽象表示形式,与平台无关 File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身. 如果需要访问文件内容本身,则需要使用输入/输出 ...
- Scratch之Android的Animation动画的四种动画效果——透明度渐变动画
废话不多说,先上图为敬 效果演示 编写的程序展示 讲话开始: 怎么想到的 在平时上课的时候,有一个学生拿着他好基友写的游戏程序给我看,最开始写的原型是叫虚像的积木块程序.通过一个局部变量开关控制虚像是 ...
- Linux在线安装MySQL5.7
Linux在线安装MySQL 5.7及编码密码修改 先检测系统是否自带安装mysql yum list installed | grep mysql 若出现mysql相关信息,卸载原始版本 yum - ...
- 你应该懂的AI大模型(十)之 LLamaFactory 之 LoRA微调Llama3
本文标题中说的微调 Llama3指的是局部微调,使用 LLamaFactory 局部微调 LIama3. 一.什么是LLamaFactory LLaMA-Factory 是一个开源的大型语言模型微调框 ...
- SQL 字符串逗号【,】分割去除重复
DROP FUNCTION GetDistinctcreate function GetDistinct(@str varchar(1000))returns varchar(1000)asBEGIN ...
- java 省略 System 写法
简介 RT code import static java.lang.System.*; 可以直接使用 out.println("ddd");
- API生命周期管理平台,构建统一API管理门户
API生命周期管理平台是企业在实施API战略过程中首选的IT支撑系统,通过RestCloud API生命周期管理平台可以全面管控企业的API资产.在数字化与智慧化的大趋势之下,中国经济正在经历从消费互 ...
- react+rust+webAssembly(wasm)示例
前言:WebAssembly(简称wasm)已经出来有几年了,在一些需要高性能的web应用场景中,wasm技术可以让代码执行效率大大提升.react做为目前大厂主流的前端框架之一,搭配上最近几年一直越 ...
- Win11专业版电脑无法打开开始菜单的问题
新系统问题千千万,win11系统占一半.今天又有电脑基地的小伙伴碰到了win11系统无法打开开始菜单的情况,那么应该如何解决这个问题呢?下面,深度技术官网小编就分享详细的处理方法,一起看看小编是如何操 ...