Обрабатывать или изменять все сообщения (любого типа), посылаемые вызовом функции SendMessage (WH_CALLWNDPROC).
Код (Text): LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { PMSG pMsg = (PMSG)lParam; if (code == HC_ACTION) { if (pMsg->message == WM_SYSCOMMAND) switch(pMsg->wParam) { case SC_MINIMIZE: pMsg->message=WM_NUL; break; case SC_RESTORE: MessageBox(NULL, (LPCWSTR)L"SC_RESTORE", (LPCWSTR)L"WM_SYSCOMMAND", MB_OK); break; } } return CallNextHookEx(Hook, code, wParam, lParam); }
punxer Собственно я там и перехватываю, а чтобы заблокировать сообщения подменяю оконную функцию через SetWindowLong. Но это громоздко. Про сабклассинг почитаю мб что путное найдется. Проблема ещё в том что окон в приложении очень много. При этом не все окна - окна Vcl. Да и с VCL окнами есть проблемы (одному и тому же VCL для работы с ним могут создаваться и уничтожаться windows-окна, то есть у окна меняется handle).
punxer все в очередь становится. wm-help.net/books-online/book/59464/59464-20.html#h26 CrazyFun SetWindowLong = сабклассинг
ASMatic с другой стороны видно что в THREADINFO есть ссылки на две очереди-синхронные(SEND) и асинхронные(POST). Все ли сообщения мы можем получить через GetMessage PeekMessage? Ответ вроде бы очевиден - да. Тем не менее автор утверждает что в хуке сообщения не перехватываются (WH_GETMESSAGE) Но в WNDPROC тем не менее приходят
punxer тс юзает (как понял) SetWindowsHook(), но это не самый лучший способ получать все что нужно, лучше юзать SetWindowLong() и быть уверенным что придёт мессага на сворачивание окна. вот тут прекрасно видно как мессаги попадают в конечные обработчики http://wm-help.net/books-online.image-load.php?img_fname=rich/images/rihter26-2.jpg
В проекте много окон. При этом VCL создает и уничтожает windows окна для работы с одним и тем же VCL окном. То есть хотелось бы перехватывать сообщения на уровне процесса.
ASMatic Ему нужно заблокировать сворачивание. SetWindowsHook() убивает двух зайцев : инжект и перехват. И поидее работать должен. Но коли нет так нет. или же SetClassLongPtr для всех окон класса если их много.
Это так, но VCL может пересоздавать окна для экземпляров TForm в процессе работы с ними. То есть у экземпляров TForm меняются Handle и все сопутствующее. SetClassLongPtr надо подумать, спасибо)
ясн, тогда да. но я бы сделал как советовали в №2 GetMessage() попатчить и не парится :0 а логи по параметрам к функам я собираю с помощью виндбг bp /p<EPROCESS> user32!GetMessage".echo GET_WINDOW_LONG*******;dd poi(esp+4) L4;gc"
ASMatic где там что то о патчить? Что ты имел ввиду? Чесслово не пойму. %) Ты про сплайс GetMessage? (оно того не стоит в этой задаче)