У меня есть такой код:
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_BUTTONCOUNT
или же TB_GETBUTTON
) отлично работает.
Итак, этот код работает правильно под Windows XP, но когда я пытаюсь выполнить его под Windows 7 x64 SendMessage
возвращает -1, что означает ошибку. Я пытался использовать GETBUTTONINFOA
вместо GETBUTTONINFO
, но результат тот же.
Что я делаю неправильно?
Решил это. Проблема была в том что TBBUTTONINFO
структура содержит указатели, которые принимают двойной размер в 64-битных процессах. Я сделал свою собственную структуру, заменив указатели на int64, и с этой структурой SendMessage работает, как и ожидалось. Спасибо всем за помощь.
Начиная с Windows Vista, изоляция привилегий пользовательского интерфейса предоставляет ограничения для системы, которые не позволяют приложениям с более низкими привилегиями отправлять оконные сообщения или устанавливать перехватчики в процессах с более высокими привилегиями. Однако приложениям с более высокими привилегиями все еще разрешается отправлять оконные сообщения процессам с более низкими привилегиями. Эти ограничения реализованы броском SendMessage
и другие функции отправки сообщений.
Я не уверен, является ли это причиной вашей проблемы, потому что в общем случае сообщения только для чтения не блокируются даже процессами с более низкими привилегиями. Ваш TB_GETBUTTONINFO
кажется, такое сообщение, то же самое для TB_BUTTONCOUNT
а также TB_GETBUTTON
, Тем не менее, вы должны исследовать это.
Увидеть Дизайн механизма целостности Windows для дополнительной информации.