鼠標指針移動到桌面快捷方式圖標上時,圖標自動播放動畫(如旋轉、彈跳、發光),非應用程式內部控件,而是系統級桌面圖標行為。
// C++ 示例關鍵點
HHOOK hHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, hInstance, 0);
// 低級鼠標鉤子回調
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
MSLLHOOKSTRUCT* p = (MSLLHOOKSTRUCT*)lParam;
// 1. 獲取鼠標坐標 p->pt
// 2. WindowFromPoint 找到該坐標下的窗口句柄
// 3. 判斷是否為桌面圖標所在的 ListView (SysListView32)
// 4. HitTest 確定具體圖標索引
// 5. 發送自定義消息或直接操作該圖標繪製動畫
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
| 難點 | 解決方案 |
|---|---|
| 桌面圖標實際是 Explorer 進程中的 ListView | 需跨進程注入 DLL 或使用 UI Automation (UIA) 遍歷元素樹 |
| 64 位系統 Hook 必須 64 位 DLL | 編譯 x64 版本,或使用 C# SetWindowsHookEx 配合 UnmanagedFunctionPointer |
| 性能影響:全局鉤子會拖慢所有鼠標消息處理 | 回調中極少邏輯,僅發送郵件槽/管道通知獨立渲染進程 |
| 安全軟件攔截全局 Hook | 簽名驗證、白名單、或改用 UIA 事件訂閱(無需 Hook) |
AutomationElementIdentifiers.BoundingRectangleProperty 變化事件;實現桌面圖標鼠標懸停動畫,核心是「全局鼠標 Hook + 跨進程定位 ListView 圖標 + 自定義渲染」。現代開發優先考慮 UI Automation,降低兼容性風險與安全攔截概率。