2012-11-07 85 views
0

我想獲得快速啓動欄大小,但是我的代碼返回false,問題在哪裏?如何在Windows XP中獲得快速啓動欄大小?

REBARBANDINFOW prbi; 
memset(&prbi, 0, sizeof(REBARBANDINFOW)); 

prbi.cbSize = sizeof(REBARBANDINFOW); 
prbi.fMask = 892; 

HWND hWndTray = ::FindWindow(L"Shell_TrayWnd", 0); 
HWND hRebar = ::FindWindowEx(hWndTray, NULL, L"ReBarWindow32", 0); 
int i = ::SendMessage(hRebar, RB_GETBANDINFOW, 0, (LPARAM)(LPREBARBANDINFOW)&prbi); 

回答

1

問題在於RB_GETBANDINFOW的LPARAM。您要發送的結構地址只在您自己的地址空間中有效,而不是Explorer。幸運的是,資源管理器檢測到這一點,並失去優雅,而不是炸燬。

解決此問題的一種方法是使用VirtualAllocEx在資源管理器的內存中分配REBARBANDINFOW,使用WriteProcessMemory對其進行初始化,發送消息,最後調用ReadProcessMemory來讀取結果。

我已經成功地在Python腳本中使用這種技術來自動設置快速啓動的大小。

+0

我試過了,它可以在Win7下運行,但在WinXP下無法運行。 – user1805887

+0

確保您將prbi.cbSize設置爲XP的正確大小(即80,如果我沒有弄錯)。注意,如果'_WIN32_WINNT> = 0x0600',REBARBANDINFO包含額外的成員。因此,如果您在Win7中編譯,那麼您將發送到XP Explorer的結構將會過大,並且會被拒絕。 – efotinis

+0

謝謝,已解決。但還有另一個問題[關於顯示快速啓動欄](http://stackoverflow.com/questions/13302460/i-want-show-quick-launch-bar-in-code) – user1805887

0

您正在嘗試獲取太多信息。地點prbi.fMask = 32;prbi.fMask = 64;