Господа, помогите понять в целях повышения самообразованности... СОздаю хук типа WH_CALLWNDPROC и в него не приходят сообщения WM_MOUSEMOVE... Это особенность хука (про нее правда в MSDN ничего не написано)? ОС Windows 2000. Обойти проблему удалось использованием WH_MOUSE_LL — низкоуровневого мышиного хука. Но для меня так и осталось непонятным, почему хук WH_CALLWNDPROC не ловит сообщения мыши. Если заменить WH_CALLWNDPROC на хук WH_GETMESSAGE — все работает! Мне всегда казалось, что разница между этими хуками только в моменте перехвата сообщения, а не в составе отлавливаемых сообщений... В чем бы могло быть дело? Может какой-то другой хук не передает сообщение дальше???
Кстати еще вопро в чем разница между низкоуровневыми (*_LL) и не низкоуровневыми хуками?
Вот код моей DLL хука:
#pragma data_seg(".SHRD")
HWND hWndServer = NULL;
#pragma data_seg()
HINSTANCE hInstance;
UINT UWM_MOUSEHOOK, UWM_WNDPROCHOOK;
HHOOK hMouseHook, hWndHook;
static LRESULT CALLBACK mousehook(int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK wndhook(int nCode, WPARAM wParam, LPARAM lParam);
BOOL __stdcall DllMain(HINSTANCE hInst, DWORD Reason, LPVOID reserved)
{
switch(Reason)
{
//**********************************************
// PROCESS_ATTACH
//**********************************************
case DLL_PROCESS_ATTACH:
hInstance = hInst;
UWM_MOUSEHOOK = RegisterWindowMessage(UWM_MOUSEHOOK_MSG);
UWM_WNDPROCHOOK = RegisterWindowMessage(UWM_WNDPROCHOOK_MSG);
return TRUE;
//**********************************************
// PROCESS_DETACH
//**********************************************
case DLL_PROCESS_DETACH:
if(hWndServer != NULL)
clearHooks(hWndServer);
return TRUE;
}
}
CLOCKHOOK_API BOOL WINAPI setHooks(HWND hWnd)
{
if(hWndServer != NULL)
return FALSE;
hMouseHook = SetWindowsHookEx(
WH_MOUSE_LL,
(HOOKPROC)mousehook,
hInstance,
0);
hWndHook = SetWindowsHookEx(
WH_CALLWNDPROC,
(HOOKPROC)wndhook,
hInstance,
0);
if(hMouseHook != NULL && hWndHook != NULL)
{
hWndServer = hWnd;
return TRUE;
}
return FALSE;
}
CLOCKHOOK_API BOOL clearHooks(HWND hWnd)
{
if(hWnd != hWndServer)
return FALSE;
BOOL unhooked = UnhookWindowsHookEx(hMouseHook) && UnhookWindowsHookEx(hWndHook);
if(unhooked)
hWndServer = NULL;
return unhooked;
}
//низкоуровневый мышиный хук
static LRESULT CALLBACK mousehook(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
{
CallNextHookEx(hMouseHook, nCode,
wParam, lParam);
return 0;
}
LPMSLLHOOKSTRUCT mh = (LPMSLLHOOKSTRUCT)lParam;
if(wParam == WM_MOUSEMOVE ) {
PostMessage(hWndServer,
UWM_MOUSEHOOK,
mh->pt.x,mh->pt.y);
}
return CallNextHookEx(hMouseHook, nCode,
wParam, lParam);
} // mousehook
//хук WH_CALLWNDPROC
static LRESULT CALLBACK wndhook(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
{
CallNextHookEx(hWndHook, nCode,
wParam, lParam);
return 0;
}
LPCWPSTRUCT cs = (LPCWPSTRUCT)lParam;
//вот это условие никогда не выполняется.... :(
if(cs->message == WM_MOUSEMOVE) {
PostMessage(hWndServer,
UWM_WNDPROCHOOK,
cs->message,0);
}
return CallNextHookEx(hWndHook, nCode,
wParam, lParam);
} // msghook
Буду благодарен за любые соображения на этот счет! Не дайте пропасть в неведении...