58同城建设网站,企业网站制作 优帮云,石碣镇网站建设,海珠网站建设哪家好程序猿对于宕机再熟悉不过了#xff0c;如果一个程序异常退出#xff0c;那我们只能在Windows日志中找到它的踪迹#xff1b;如果它是一个托盘程序#xff0c;异常退出后#xff0c;它会停留在托盘中久久不能离去#xff0c;直到我们的鼠标从它身上划过#xff1b;如果一… 程序猿对于宕机再熟悉不过了如果一个程序异常退出那我们只能在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(); 托盘又恢复往日简洁 ^_^ 转载于:https://www.cnblogs.com/boxy/p/11402966.html