Установка хука ( обработчик сообщения от функции фильтра)

Тема в разделе "WASM.BEGINNERS", создана пользователем tender_swallow, 27 июн 2007.

  1. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    Если что сильно меня не пинайте за тупые вопросы ибо в программировании я новичок.

    Вообщем, осваиаваю туториалы Iczeliona, правда пишу все это на C. У меня возник ступор на уроке 24 по хукам.
    Проблема в том, что диалоговая поцедура получает сообщение WM_MOUSEHOOK только один раз после установки хука, далее приложение никак не реагирует на манипуляции с мышью. Если же в конце обработчика сообщения WM_MOUSEHOOK снимать хук на действия мыши, а затем снова его ставить, то тогда все работает правильно, но, как я понимаю, такой подход к решению проблемы кривой:
    Код (Text):
    1.     case WM_MOUSEHOOK:
    2.                  .........
    3.  
    4.         UninstallHook();
    5.         InstallHook(hDlg);
    6.         break;
    Предполагаю, что проблема связана с разделяемыми глобальными переменнымив Dll, так как эксперименты показали что приложению все равно помечаю ли я переменные разделяемыми или нет:
    Код (Text):
    1. #pragma data_seg("Shared")
    2. __declspec(allocate("Shared")) HWND hWnd;
    3. __declspec(allocate("Shared")) HHOOK hHook;
    4. #pragma data_seg()
    5.  
    6. #pragma comment(linker, "/SECTION:Shared,RWS")
    Если у кого-нибудь есть соображения на счет причин такого поведения приложения, то поделитесь пожалуйста мыслями.
     
  2. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Причины просты
    Код обработки твой где находится? В процедуре ИнсталХук или самого обработчика? Где-то была статья по хукам от Bill Prisoner

    Замечательная кстати. Все куда более понятно чем у Икзелеона.
    Еще желательно код приведи свой. Зачем строить догадки, если при приведении кода можно указать на ошибку..? )))
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    tender_swallow
    Ты свой код не показываешь. В аттаче мой Си'шный вариант 24-го урока. Сравнивай.
     
  4. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    Вот привожу свой код:
    Код (Text):
    1. #include <windows.h>
    2.  
    3. BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
    4.  
    5. #define IDD_MAINDLG 101
    6. #define IDC_CLASSNAME 1000
    7. #define IDC_HANDLE 1001
    8. #define IDC_WNDPROC 1002
    9. #define IDC_HOOK 1003
    10. #define IDC_EXIT 1005
    11.  
    12. #define WM_MOUSEHOOK WM_USER+1
    13.  
    14. bool HookFlag=FALSE;
    15. char LibName[]="MyDll";
    16. char HookText[]="&Hook";
    17. char UnhookText[]="&Unhook";
    18. char templat[]="%1x";
    19.  
    20. FARPROC UninstallHook;
    21. HHOOK (*InstallHook)(HWND);
    22. HINSTANCE hLib;
    23.  
    24. //---------------------------------------------------
    25. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,  LPSTR CmdLine, int CmdShow)
    26. {
    27.     hLib=LoadLibrary(LibName);
    28.     if (hLib==NULL) MessageBox(NULL, "DLL not found", "Dll", MB_OK);
    29.     else{
    30.         UninstallHook=GetProcAddress(hLib, "UninstallHook");
    31.         if (UninstallHook==NULL) MessageBox(NULL, "Uninstall function not found", "Dll", MB_OK);
    32.         InstallHook=(HHOOK(*)(HWND))GetProcAddress(hLib, "InstallHook");
    33.         if (InstallHook==NULL) MessageBox(NULL, "Install function not found", "Dll", MB_OK);
    34.     }
    35.     return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MAINDLG), NULL, DlgProc, NULL);
    36. }
    37.  
    38. BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
    39. {
    40. static HINSTANCE hInst;
    41. char buffer[128];
    42. char buffer1[128];
    43. RECT rect;
    44.  
    45.     switch (uMsg)
    46.     {
    47.     case WM_CLOSE:
    48.         if (HookFlag) UninstallHook();
    49.         EndDialog(hDlg, NULL);
    50.         break;
    51.     case WM_INITDIALOG:
    52.         GetWindowRect(hDlg, &rect);
    53.         SetWindowPos(hDlg, HWND_TOPMOST, rect.left, rect.top, rect.right, rect.bottom, SWP_SHOWWINDOW);
    54.         break;
    55.    
    56.     case WM_COMMAND:
    57.         if (lParam!=0){
    58.             if (HIWORD(wParam)==BN_CLICKED){
    59.                 if (LOWORD(wParam)==IDC_EXIT) SendMessage(hDlg, WM_CLOSE, 0, 0);
    60.                 else{
    61.                     if (HookFlag==FALSE){
    62.                         if (InstallHook(hDlg)!=NULL){
    63.                             HookFlag=TRUE;
    64.                             SetDlgItemText(hDlg, IDC_HOOK, UnhookText);
    65.                         }
    66.                     }
    67.                     else {
    68.                         UninstallHook();
    69.                         SetDlgItemText(hDlg, IDC_HOOK, HookText);
    70.                         HookFlag=FALSE;
    71.                         SetDlgItemText(hDlg, IDC_CLASSNAME, NULL);
    72.                         SetDlgItemText(hDlg, IDC_HANDLE, NULL);
    73.                         SetDlgItemText(hDlg, IDC_WNDPROC, NULL);
    74.                     }
    75.                 }
    76.             }
    77.         }
    78.         break;
    79.    
    80.     case WM_MOUSEHOOK:
    81.         //GetDlgItemText(hDlg, IDC_HANDLE, buffer1, 128);
    82.         //wsprintf(buffer, templat, wParam);
    83.         //if (lstrcmpi(buffer, buffer1)!=0) SetDlgItemText(hDlg, IDC_HANDLE, buffer);
    84.         //SetDlgItemText(hDlg, IDC_HANDLE, buffer);
    85.         //GetDlgItemText(hDlg, IDC_CLASSNAME, buffer1, 128);
    86.         GetClassName((HWND)wParam, buffer, 128);
    87.         //if (lstrcmpi(buffer, buffer1)!=0) SetDlgItemText(hDlg, IDC_CLASSNAME, buffer);
    88.         SetDlgItemText(hDlg, IDC_CLASSNAME, buffer);
    89.         break;
    90.     default:
    91.         return FALSE;
    92.     }
    93.     return TRUE;
    94. }
    95.  
    96. // Dll_code----------------------------------------------------------------------------
    97.  
    98. #include <windows.h>
    99.  
    100. extern "C" __declspec(dllexport) void Mouseproc(DWORD nCode, WPARAM wparam, LPARAM lparam);
    101.  
    102. #define WM_MOUSEHOOK WM_USER+1
    103.  
    104. HINSTANCE hInstance=0;
    105. #pragma data_seg("Shared")
    106. __declspec(allocate("Shared")) HWND hWnd;
    107. __declspec(allocate("Shared")) HHOOK hHook;
    108. #pragma data_seg()
    109.  
    110. #pragma comment(linker, "/SECTION:Shared,RWS")
    111.  
    112.  
    113. BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReservrd)
    114. {
    115.     switch (dwReason)
    116.     {
    117.     case DLL_PROCESS_ATTACH:
    118.         hInstance=hDll;
    119.         break;
    120.     case DLL_THREAD_ATTACH:
    121.         break;
    122.     case DLL_THREAD_DETACH:
    123.         break;
    124.     case DLL_PROCESS_DETACH:
    125.         break;
    126.     }
    127.  
    128.     return TRUE;
    129. }
    130.  
    131. extern "C" __declspec(dllexport) HHOOK InstallHook(HWND hwnd)
    132. {
    133.     hWnd=hwnd;
    134.     hHook=SetWindowsHookEx(WH_MOUSE, (HOOKPROC)Mouseproc, hInstance, NULL);
    135.     return hHook;
    136. }
    137.  
    138. extern "C" __declspec(dllexport) void UninstallHook(void)
    139. {
    140.     UnhookWindowsHookEx(hHook);
    141.     return;
    142. }
    143.  
    144. extern "C" __declspec(dllexport) void Mouseproc(DWORD nCode, WPARAM wparam, LPARAM lparam)
    145. {
    146. static MOUSEHOOKSTRUCT mousehookstr;
    147. static MOUSEHOOKSTRUCT *pMouse;
    148.  
    149.     CallNextHookEx(hHook, nCode, wparam, lparam);
    150.     pMouse=(MOUSEHOOKSTRUCT *)lparam;
    151.     mousehookstr=*pMouse;
    152.     PostMessage(hWnd, WM_MOUSEHOOK, (WPARAM)WindowFromPoint(mousehookstr.pt), 0);
    153.     return;
    154. }
     
  5. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    Если имеется в виду код обработки сообщения WM_MOUSEHOOK, то он находится в диалоговой процедуре главного окна. Если же речь идет о функции-фильтре для ловушки, то она находится в Dll в отдельной процедуре, на которую дается указатель при установке хука на события мыши.

    Если я недопонял вопрос, то поправьте меня.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    tender_swallow
    У тебя MouseProc - void, а должна быть LRESULT. Исправь тип, поставь return 0;.
     
  7. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    q_q
    А почему должно быть именно LRESULT?
    Опыт показал, что это никак не влияет на функционирование программы:dntknw:
     
  8. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    q_q
    Да, твоя правда, а я просто тупил два дня.

    Оказывается причина в том, что функция-фильтр должна быть функцией обратного вызова, и это естественно ведь ее вызов осуществляет ОС, отсюда соответственно и возвращаемый параметр типа LRESULT.

    Спасибо твоя подсказка помогла :)