LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MSG *ps=(MSG *)lParam;
if (nCode < 0)
{
return CallNextHookEx(g_hhook,nCode,wParam,lParam);
}
if (ps->message==UM_SET_PROC)
{
g_OldWndProc=(WNDPROC)GetWindowLong(ps->hwnd,GWL_WNDPROC);
SetWindowLong(ps->hwnd,GWL_WNDPROC,(LONG)SubClassWndProc);
SendMessage(ps->hwnd,UM_RESET_HOOK,0,0);
PostThreadMessage(g_dwThreadIdExe,UM_HOOK_DONE,0,0);
return 0;
}
return CallNextHookEx(g_hhook,nCode,wParam,lParam);
}
Хук и смена процедуры окна
g_hhook=::SetWindowsHookEx(WH_GETMESSAGE, reinterpret_cast<HOOKPROC>(GetMsgProc),(HINSTANCE)g_hInstDll,dwThreadId);
Посылаю сообщение
PostMessage(hwnd,UM_SET_PROC,(WPARAM)SubclassWndProc,0);
вот функция GetMsgProc:
Код:
Всё работает...
Не понятно только почему в процедуру SubClassWndProc поступает сообщение UM_SET_PROC с параметрами wParam=0x01001005 lParam=0. И это не зависит от того как я задефайню UM_SET_PROC.
Я думал, что может это после смены процедуры моё сообщение дальше передается, но нет.... я передаю в wParam другое число и вообще из GetMsgProc возвращаю 0, значит обработал....
Хук ведь можно снимать?
Кстати в процедуре SubClassWndProc, в обработчике UM_SET_PROC, если wParam==0x01001005, хоть я 0 возвращаю, хоть передаю дальше:
return CallWindowProc(g_OldWndProc,hwnd,uMsg,цParam,lParam);
Всё равно мой эксплоер виснет =)...
просто посылать сообщение UM_SET_PROC нужно было потоку:
Код:
PostThreadMessage(dwThreadId,UM_SET_PROC,
(WPARAM)SubClassWndProc,(LPARAM)hwndShell_TrayWnd)
(WPARAM)SubClassWndProc,(LPARAM)hwndShell_TrayWnd)
хотя я так и не понял почему окну нельзя:
Код:
PostMessage(hwndShell_TrayWnd,UM_SET_PROC,(WPARAM)SubClassWndProc,0);
но главное что пашет...