首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

AAuto 實用技巧:模擬鼠標掃過刷新系統托盤圖標

     編輯:關於C語言

核心思路

系統托盤區殘留無效圖標通常因進程退出未正確調用 Shell_NotifyIcon(NIM_DELETE)。模擬鼠標遍歷托盤區觸發 WM_MOUSEMOVE,Explorer 會自動清理無效圖標。

完整封裝函數

import winex; import winex.mouse;

// 遞歸移動鼠標遍歷窗口客戶區
var mouseMoveWnd = function(hwnd) {
    if (!hwnd) return;
    var x, y, cx, cy = win.getPos(hwnd);
    for (x = 1; x <= cx; x += 2) {
        for (y = 1; y <= cy; y += 2) {
            winex.mouse.move(hwnd, x, y);
        }
    }
}

// 主刷新函數
refreshTrayIcon = function() {
    // 1. 主托盤區 ToolbarWindow32
    var hwnd = winex.findExists(, , "Shell_TrayWnd", "TrayNotifyWnd");
    var toolbar = winex.findEx(winex.findEx(hwnd, , "SysPager"), , "ToolbarWindow32");
    mouseMoveWnd(toolbar);

    // 2. 溢出區 ToolbarWindow32 (Win7+)
    var _, hwndOverflow = winex.findExists(, , "NotifyIconOverflowWindow", "ToolbarWindow32");
    mouseMoveWnd(hwndOverflow);
}

// 執行清理
refreshTrayIcon();

替代方案:直接發送 WM_MOUSEMOVE

hwnd = winex.findExists(, "通知區域", "Shell_TrayWnd", "ToolbarWindow\d+");
var re, rcWindow = GetClientRect(hwnd, ::RECT());
for (x = 1; x <= rcWindow.right; x++) {
    for (y = 1; y <= rcWindow.bottom; y++) {
        PostMessage(hwnd, 0x200 /*WM_MOUSEMOVE*/, 0, y * 65536 + x);
    }
}

無需模擬真實鼠標移動,速度更快,但需確保目標窗口類名匹配(正則 ToolbarWindow\d+)。

適用場景

  • 安裝/卸載腳本結束後清理殘留托盤圖標
  • 自動化測試環境重置
  • 系統維護工具一鍵淨化托盤區
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved