有些Window應用程序在啟動以後會在系統托盤去添加一個小圖標, 一般情況下當程序正常退出時會自動去掉,但有時由於應用程序非法關閉,這個圖標便一直留在托盤區,直到用鼠標移動圖標上時,才會自己消失.那麼我們就可以模擬鼠標移動到逐個圖標上,來達到這個效果.
void __fastcall RemoveDeadIcons()
{
HWND hTrayWindow;
RECT rctTrayIcon;
int nIconWidth;
int nIconHeight;
TPoint CursorPos;
int nRow;
int nCol;
// Get tray window handle and bounding rectangle
hTrayWindow = FindWindowEx(FindWindow(
"Shell_TrayWnd", NULL), 0, "TrayNotifyWnd", NULL);
if(!GetWindowRect(hTrayWindow, &rctTrayIcon))
return;
// Get small icon metrics
nIconWidth = GetSystemMetrics(SM_CXSMICON);
nIconHeight = GetSystemMetrics(SM_CYSMICON);
// Save current mouse position }
GetCursorPos(&CursorPos);
// Sweep the mouse cursor over each icon in the tray in both dimensions
for(nRow=0; nRow<(rctTrayIcon.bottom-rctTrayIcon.top)/nIconHeight; nRow++)
{
for(nCol=0; nCol<(rctTrayIcon.right-rctTrayIcon.left)/nIconWidth; nCol++)
{
SetCursorPos(rctTrayIcon.left + nCol * nIconWidth + 5,
rctTrayIcon.top + nRow * nIconHeight + 5);
Sleep(0);
}
}
// Restore mouse position
SetCursorPos(CursorPos.x, CursorPos.x);
// Redraw tray window (to fix bug in multi-line tray area)
RedrawWindow(hTrayWindow, NULL, 0, RDW_INVALIDATE RDW_ERASE RDW_UPDATENOW);
}