Загадки с хуками...
От: Kochuev  
Дата: 10.10.04 09:27
Оценка:
Господа, помогите понять в целях повышения самообразованности... СОздаю хук типа 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


Буду благодарен за любые соображения на этот счет! Не дайте пропасть в неведении...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.