十字星

  • 首页
  • 技术
  • 随笔
  • 瞎折腾
  • 平面设计
  • 文集
  • 留言
  • 其他
    • API测试
  1. 首页
  2. 技术
  3. 正文

程序异常退出,重新启动后,自动清理系统托盘上残留的图标

2021-12-15 1437点热度 0人点赞 0条评论
关键代码类

using System;
using System.Runtime.InteropServices;

namespace WinTestButton
{
    public class TaskBarUtil
    {
        struct RECT
        {
            public int left, top, right, bottom;
        }
        /// <summary>刷新系统托盘图标,释放程序上次异常退出时留在系统托盘的图标</summary>
        public static void RefreshNotification()
        {
            var NotifyAreaHandle = GetNotifyAreaHandle();
            if (NotifyAreaHandle != IntPtr.Zero)
                RefreshWindow(NotifyAreaHandle);

            var NotifyOverHandle = GetNotifyOverHandle();
            if (NotifyOverHandle != IntPtr.Zero)
                RefreshWindow(NotifyOverHandle);
        }

        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);
        }
        /// <summary>直接显示区域</summary>
        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", null);

            return NotifyAreaHandle;
        }
        /// <summary>溢出隐藏区域</summary>
        static IntPtr GetNotifyOverHandle()
        {
            var OverHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "NotifyIconOverflowWindow", string.Empty);
            var NotifyOverHandle = FindWindowEx(OverHandle, IntPtr.Zero, "ToolbarWindow32", null);

            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);
    }
}

程序启动时调用

WinTestButton.TaskBarUtil.RefreshNotification();

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: C# WinForm
最后更新:2021-12-15

cxw

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最新 热点 随机
最新 热点 随机
git迁移项目中的某个目录到新项目 winform判断设计模式还是运行时模式 C# 中的where T : class, new() 到底是什么意思? 解决安装.NET失败并提示“无法建立到信任根颁发机构的证书链” 关闭.net4.0的http访问默认代理 删除名称最后带空格的文件夹
北京今天下雪啦 Visual Studio Code(vs code)改中文显示 centos系统下使用yum update报错:error: rpmdb: BDB0113 Thread/process 4001610/139762934704000 failed: BDB1507 Thread died in Berkeley DB library 筛选DataTable中符合某一列条件的行 C# 控件首次显示时,[Anchor]属性影响动态计算控件位置 Hyper-V安装无桌面版CentOS 6.5并配置自启动redis服务之二:在虚拟机中安装CentOS 6.5
标签聚合
CentOS Excel Linux 工具 C# WinForm WordPress W10 PHP IT
最近评论
admin 发布于 5 年前(01月22日) 使用Andi Dittrich作者的插件Enlighter实现
alex 发布于 5 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

Theme Kratos Made By Seaton Jiang