十字星

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

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

2021-12-15 156点热度 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

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >

文章评论

取消回复

最新 热点 随机
最新 热点 随机
删除名称最后带空格的文件夹 esxi无法直通sata控制器,只能使用rdm直通硬盘 Esxi总是会话超时需要重新登录,修改配置,增加超时时间 WinAPI函数SetupDiEnumDeviceInterfaces始终返回false解决方案 删除tmp文件夹内容导致网站503 Service Unavailable解决 SQL Server 附加数据库出错,操作系统错误 5:"5(拒绝访问。)" 错误:5120
删除tmp文件夹内容导致网站503 Service Unavailable解决esxi无法直通sata控制器,只能使用rdm直通硬盘WinAPI函数SetupDiEnumDeviceInterfaces始终返回false解决方案Esxi总是会话超时需要重新登录,修改配置,增加超时时间删除名称最后带空格的文件夹
Android Studio 多个真实设备无线调试 Visual Studio Code(VSCode)中查看php数组的全部元素 MySQL修改自增列起始值 Excel表格拖动公式保持行号或者列号不变 WordPress5.5版本如何使用自带站点地图sitemap 北京今天下雪啦
标签聚合
PHP Linux WinForm W10 IT CentOS Hyper-V WordPress Excel C#
最近评论
alex 发布于 1 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

THEME KRATOS MADE BY VTROIS

京ICP备2020032489号-1