TB_GETBUTTONINFO 在 Windows 7 上失败

Posted

技术标签:

【中文标题】TB_GETBUTTONINFO 在 Windows 7 上失败【英文标题】:TB_GETBUTTONINFO fails on Windows 7 【发布时间】:2014-03-20 08:11:04 【问题描述】:

我有一些这样的代码:

TBBUTTONINFO mtbbi;
HWND hwnd;
HANDLE hProc;
DWORD dwProcessID;
void* lpData;

.....

GetWindowThreadProcessId(hwnd, &dwProcessID);
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessID);
lpData = VirtualAllocEx(hProc , 0, sizeof(TBBUTTONINFO), MEM_COMMIT, PAGE_READWRITE);
memset(&mtbbi,0,sizeof(mtbbi));
mtbbi.cbSize=sizeof(TBBUTTONINFO);
mtbbi.dwMask=TBIF_BYINDEX|TBIF_LPARAM;  
WriteProcessMemory(hProc,lpData,&mtbbi,sizeof(TBBUTTONINFO),&dwBytesRead);
SendMessage(hwnd, TB_GETBUTTONINFO, 0, (LPARAM)lpData);
ReadProcessMemory(hProc, lpData, &mtbbi, sizeof(TBBUTTONINFO), &dwBytesRead);

其中hwnd - 是工具栏句柄。这个句柄是正确的,其他消息(如TB_BUTTONCOUNTTB_GETBUTTON)工作正常。 因此,这段代码在 Windows XP 下可以正常工作,但是当我尝试在 Windows 7 x64 下执行它时 SendMessage 返回 -1,这意味着错误。我尝试使用GETBUTTONINFOA 而不是GETBUTTONINFO,但结果是一样的。

我做错了什么?

【问题讨论】:

在罗马时,表现得像个罗马人。如果你正在破解的那个程序正在运行提升,那么你也必须运行提升。如果它是 64 位进程,那么您也必须是 64 位进程。不要破解任务栏,这是不合时宜的做法。 从表面上看:错误的结构大小、错误的 hwnd、错误的按钮索引。也许你应该做一个完整的复制案例,包括一条有效的消息。我相信有人会调试它。 【参考方案1】:

解决了。问题是TBBUTTONINFO 结构包含指针,这些指针在 64 位进程中采用双倍大小。我制作了自己的结构,用 int64 替换了指针,并且使用这个结构 SendMessage 按预期工作。感谢大家的帮助。

【讨论】:

【参考方案2】:

从 Windows Vista 开始,用户界面权限隔离对系统提供了限制,以防止低权限应用程序发送窗口消息或在高权限进程中安装挂钩。但是,仍然允许更高权限的应用程序向更低权限的进程发送窗口消息。这些限制实现了 throwSendMessage 和其他消息发送功能。

我不确定这是否是您的问题的原因,因为通常情况下,即使来自较低权限的进程也不会阻止只读消息。您的 TB_GETBUTTONINFO 似乎是这样的消息,TB_BUTTONCOUNTTB_GETBUTTON 也是如此。但是,您应该对此进行调查。

更多信息请参见Windows Integrity Mechanism Design。

【讨论】:

以上是关于TB_GETBUTTONINFO 在 Windows 7 上失败的主要内容,如果未能解决你的问题,请参考以下文章

请问在js里,window有多少种方法?

ExtJs在页面上window再调用Window的事件处理

WPF window页面跳转

如何在 Vue JS 中添加 window.addEventListener 和删除 window.removeEventListener

如何使用window.open在JSP页面之间传递【多个】参数?

在window.open打开的窗口里再用window.open办法打开一窗口