隱藏Windows系統托盤表徵圖(改進版)

來源:互聯網
上載者:User

    在上一篇文章
中,寫了一個sample
,用於隱藏表徵圖,但是有網友提出,能不能在程式介面上顯示當前的托盤表徵圖,這樣更直觀一些。這一點我也曾想到過,也知道奧秘就在TBBUTTON這個結構體的dwData域裡面,可惜這個域的結構在MSDN
中沒有描述。我也曾試著發送TB_GETIMAGELIST訊息擷取image list的控制代碼,然後用CImageList::FromHandle載入到CImageList中,但卻都失敗了。

    在csdn
網友的協助下,我弄清了dwData的結構,並據此改進了程式,下面的是改進版啟動並執行畫面。
   

    其實dwData有一個這樣的機構,我們命名為TRAYDATA:

  1. struct
     TRAYDATA
  2. {
  3.     
    HWND
     hwnd;                  
  4.     
    UINT
     uID;               
  5.     
    UINT
     uCallbackMessage;      
  6.     
    DWORD
     Reserved[2];          
  7.     
    HICON
     hIcon;                
    //托盤表徵圖的控制代碼
  8. }; 

    要擷取到這個hIcon,其實很簡單:

  1. //分配虛擬記憶體
  2. lngAddress = VirtualAllocEx(hProcess,  NULL,  
    sizeof
    (TBBUTTON), MEM_COMMIT, PAGE_READWRITE); 
  3.   
  4. //將hProcess進程內,地址為lngAddress中的內容(大小為sizeof(TBBUTTON))擷取到tb中
  5. ret = ::ReadProcessMemory(hProcess, LPVOID(
    long
    (lngAddress)), &tb, 
    sizeof
    (TBBUTTON), 0);

  6. //將hProcess進程內,地址為tb.dwData中的內容(大小為sizeof(TRAYDATA))擷取到tray中
  7. ret = ::ReadProcessMemory(hProcess, LPVOID(tb.dwData), &tray, 
    sizeof
    (TRAYDATA), 0);

    然後就可以用tray.hIcon索引到這個表徵圖控制代碼了,此外我們還可以用tray.hwnd擷取到它所在進程的執行路徑,最後我們添加一個CListControl控制項,並在OnInitDialog()過程中進行控制項的初始化:

  1. m_ImageList.Create(16,16,ILC_COLOR24,16,16);
  2. m_ListCtl.SetImageList(&m_ImageList,LVSIL_SMALL);    
  3. m_ListCtl.SetExtendedStyle(LVS_EX_FULLROWSELECT);
  4. m_ListCtl.InsertColumn(0, 
    "表徵圖"
    , LVCFMT_LEFT, 50);
  5. m_ListCtl.InsertColumn(1, 
    "應用程式路徑"
    , LVCFMT_LEFT, 500);
  6. m_ListCtl.InsertColumn(2, 
    "提示資訊"
    , LVCFMT_LEFT,300);

    最後將擷取到的資訊填入這個控制項中:

  1.         lv.iSubItem = 0;
  2.         lv.mask = LVIF_IMAGE;
  3.         lv.iItem = m_ListCtl.GetItemCount();
  4.     
  5.         
    if
    (GetIconInfo(tray.hIcon,&icon_info) != 0)
  6.         {           
  7.                 lv.iImage = m_ImageList.Add(tray.hIcon);
  8.                 ::ZeroMemory(&icon_info,
    sizeof
    (ICONINFO));
  9.         }
  10.         m_TifoVec.push_back(tifo);
  11.         
    int
     index = m_ListCtl.InsertItem(&lv);
  12.         m_ListCtl.SetItemText(index,1,GetFilenameFromPid(dwProcessId));
  13.         
    if
    (!(tb.fsState&TBSTATE_HIDDEN))
  14.         {
  15.             ret = ::ReadProcessMemory(hProcess,
    LPVOID
    (tb.iString),&strBuff,1024,0);
  16.             USES_CONVERSION;
  17.             m_ListCtl.SetItemText(index,2,OLE2T((LPOLESTR)(strBuff)));
  18.         }
  19.         
    else
  20.         {
  21.              m_ListCtl.SetItemText(index,2,
    "[Hidden Icon]"
    );
  22.         }

    此外,因為我們能得到進程id,所以可以有更多的應用,這裡就不示範了,這個改進版的代碼可以在這裡下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.