程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 如何自動移去系統托盤失效的圖標

如何自動移去系統托盤失效的圖標

編輯:關於C++

有些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);
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved