Перехват сообщений
Код:
SendMessage(FindWindow('Progman', 'Program Manager'), WM_CLOSE, 0, 0)
Поставить глобальный хук с параметром WH_GETMESSAGE. При выполнении процедуры хука проверять окну какого класса послано сообщения, если класс окна 'Progman' и сообщение WM_CLOSE, то заменить его на WM_NULL.
P.S. Вы уверены, что речь идет о WH_GETMESSAGE, а не о WH_CALLWNDPROC?
Code - если равно HC_ACTION, то следует обрабатывать, иначе пропустить
wParam - если равно PM_NOREMOVE, то сообщение не будет удалено из очереди сообщений, если PM_REMOVE - будет
lParam - указатель на структуру MSG
Ага... А какой параметр содержит тип передаваемого сообщения (в данном случае WM_CLOSE)? И, если вас не затруднит, подкиньте какой-нибудь простенький пример использвования WH_GETMESSAGE.
Код:
typedef struct {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
hwnd - окно, которому послано сообщение
message - идентификатор сообщения, его как раз и нужно заменить на WM_NULL, если нужно, чтобы сообщение было проигнорировано
Понял, спасибо, буду разбираться...
Код:
for (;;)
{
GetMessage(messag,FindWindow("Progman","Program Manager"),0,0);
messag.message = WM_NULL;
}
{
GetMessage(messag,FindWindow("Progman","Program Manager"),0,0);
messag.message = WM_NULL;
}
В hook-функции нужно написать примерно следующее:
Код:
...
if (((MSG *) lParam)->message == WM_CLOSE && ((MSG *) lParam)->hwnd == FindWindow("Progman","Program Manager"))
((MSG *) lParam)->message = WM_NULL;
...
if (((MSG *) lParam)->message == WM_CLOSE && ((MSG *) lParam)->hwnd == FindWindow("Progman","Program Manager"))
((MSG *) lParam)->message = WM_NULL;
...