2012-11-07 44 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;