詳解XP托盤圖標結構!

下面是轉摘。

但是開發的時候要注意 64位系統和32位系統 的數據結構不一致 


詳解XP托盤圖標結構。

關於這個標題,純粹是標題黨的作爲,因爲我還沒有這個資格是說“詳解”,只是能說是我自己一些見解!
近日因爲要更新一個托盤管理的軟件,所以要苦下頭翻譯一個國外的托盤結構獲取的經典軟件(C++版)(http://www.codeproject.com/KB/applications/ShellTrayInfo.aspx),在翻譯過程有一些自己體會,所寫在這裏給大家一起討論。

首先它的這個軟件用到一個結構,據說是一個未公開的托盤結構。
原版爲:
struct TRAYDATA
{
HWND hwnd;    
UINT uID;    
UINT uCallbackMessage; 
DWORD Reserved[2];  
HICON hIcon;    
};
後經過試驗,發現在XP下結構是應該還包括一個路徑參數,但2000下是沒有的。
Public Type TRAYDATA
    hwnd              As Long
    uId               As Long
    uCallBackMessage As Long
    Reserved1(0 To 1) As Long
    hIcon             As Long
    Reserved2(0 To 5) As Integer
    ExePath(0 To 255) As Byte
End Type
至於怎樣得到這個結構,這就得借用一個TBBUTTON結構(結構如下),因爲這結構的dwData指示TRAYDATA所在位置。
Public Type TBBUTTON
    iBitmap         As Long
    idCommand       As Long
    fsState         As Byte
    fsStyle         As Byte
    bReserved1      As Byte
    bReserved2      As Byte
    dwData          As Long '這個指示了TRAYDATA的位置。
    iString         As Long
End Type

綜上所述,我們可以這樣得到以下結論:
得到以下流程圖。

"Shell_TrayWnd" -> "TrayNotifyWnd" -> "SysPager" -> "ToolbarWindow32"最終得到托盤窗口句柄 -> 通過發送 TB_BUTTONCOUNT消息得到托盤窗口TBBUTTON的個數 -> 通過得到總數,用FOR循環,向每個BUTTON發送TB_GETBUTTON消息 -> 用ReadProcessMemory讀取每個TBBUTTON結構 -> 再通過TBBUTTON.dwData 得到TRAYDATA結構。

只要得到這個結構,那麼托盤的圖標,就任我爲所欲爲了,修改圖標,隱藏圖標,右移圖標小事一件了。。

下面是模仿C++測試軟件(改天發佈一個我已寫完的更多功能桌面托盤管理軟件):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章