Почесу хук работает только внутри одного процесса???

Тема в разделе "WASM.WIN32", создана пользователем serega28, 13 окт 2008.

  1. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Код DLL:

    Код (Text):
    1. #pragma data_seg(".SHRDATA")
    2.     HWND hWndMain = NULL;
    3. #pragma data_seg()
    4.  
    5. HHOOK hook;
    6. HINSTANCE hInstance;
    7.  
    8. __declspec(dllexport) LRESULT CALLBACK KeyboardProc(UINT nCode, WPARAM wParam, LPARAM lParam)
    9. {
    10.    MessageBox(NULL,"Hook","Hook",MB_OK);
    11.    return CallNextHookEx(hook, nCode, wParam, lParam);
    12. }
    13.  
    14. __declspec(dllexport) void InstallHook(HWND hWnd,int iTKey)
    15. {
    16.    hook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hInstance,  NULL);
    17. }
    18.  
    19. bool APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    20. {
    21.     switch (ul_reason_for_call)
    22.     {
    23.         case DLL_PROCESS_ATTACH:
    24.                 hInstance = (HINSTANCE)hModule;
    25.         break;
    26.  
    27.         case DLL_THREAD_ATTACH:
    28.         case DLL_THREAD_DETACH:
    29.         break;
    30.         case DLL_PROCESS_DETACH:
    31.             UnInstallHook(hWndMain);
    32.         break;
    33.     }
    34.     return TRUE;
    35. }
    А это код приложения:

    Код (Text):
    1. #pragma comment (lib, "keyshook.lib")
    2.  
    3. __declspec(dllimport) void InstallHook(HWND hWnd, int iTKey);
    4. __declspec(dllimport) void UnInstallHook(HWND hWnd);
    5.  
    6. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    7. {
    8.     InitCommonControls();
    9.     hDlg=CreateDialog(hInst, MAKEINTRESOURCE(ID_MDIALOG), 0, (DLGPROC) DlgProc);
    10.  
    11.  
    12.     while ((GetMessage(&Msg, NULL, 0, 0)) != 0)
    13.     {
    14.           if (!IsWindow(hDlg) || !IsDialogMessage(hDlg, &Msg))
    15.           {
    16.     TranslateMessage(&Msg);
    17.     DispatchMessage(&Msg);
    18.           }
    19.     }
    20.  
    21. }
    22.  
    23. ..............
    24.  
    25. BOOL CALLBACK DlgProc(HWND hWndDlg, UINT message, WPARAM wParam, LPARAM lParam)
    26. {
    27.     switch (message)
    28.     {
    29.         case WM_INITDIALOG:
    30.             InstallHook(hWndDlg, dwTypeKey);
    31.         break;
    32.  
    33.         case WM_MOUSEHOOK:
    34.                
    35.         break;
    36.  
    37.      }
    38. .......
    39.  
    40. }
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    serega28
    У тебя, вроде, все правильно.
    см. аттач, он у меня работает.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ps на #define WM_MOUSEHOOK (WM_USER+6) из cdll.h внимания не обращай.
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Так вроде все верно, но есть одно подозрительное место. Не мешало бы показать код UnInstallHook().
    Вот смотри - ты загрузил ДЛЛ в свой основной процесс, вызвал InstallHook(). Система добавила соответсвующую структуру tagHOOK в цепочку хуков данного типа. В другом процессе, при обработке сообщения от клавы, система видит, что есть хук, процедуру которого надо вызвать. Если ДЛЛ еще не подгружена, система загружает ее и вызывает процедуру. Т.е. тут все ок.
    А теперь представь, что уже "похуканный" процесс завершает свою работу. Т.е. во всех ДЛЛ в этом процессе (и нашей ДЛЛ с callback-функцией хука) вызывается DllMain с флагом DLL_PROCESS_DETACH. А у тебя в обработчике DLL_PROCESS_DETACH стоит UnInstallHook(). Так как хэндл хука глобален (по аналогии с hWnd), то вызвав UnInstallHook() в другом процессе ты вообще снимешь свой хук.

    Может я и ошибся в рассуждениях, но это первое, что бросилось в глаза. А почему хук работает внутри одного процесса (точнее было бы сказать для одного потока) я не знаю - возможно ты ошибся.
     
  5. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Все верно заметил. Удалил эту вещь.
    У меня что-то с инстансем в ДЛЛ.
     
  6. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Все заработало.
    Поставил DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, LPVOID lpReserved) вместо DllMain(HANDLE hModule...

    Странно все таки как-то.
     
  7. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Странно, конечно, но MSDN говорит ставить именно HINSTANCE:
    Код (Text):
    1. BOOL WINAPI DllMain(
    2.   __in  HINSTANCE hinstDLL,
    3.   __in  DWORD fdwReason,
    4.   __in  LPVOID lpvReserved
    5. );
     
  8. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Вот пришло в хук сообщение WM_KEYDOWN к примеру. А как сделать чтобы сообщение не долшо приложению или вообще поменять на другой мессаж???
     
  9. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    что бы сообщение не дошло до адресата убираешь CallNextHookEx и вставляешь return 1

    Поменять на другой мессаж? смотря на какой. Нужно курить структуры, на которые ссылается lParam.
    Соответственно сформировать свою структуру сообщения, и занести ее в lParam и вызвать return CallNextHookEx(NULL, nCode, wParam, lParam);.
     
  10. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Пытаюсь вставить определенный текст в позицию курсора. Но сообщение не всегда срабатывает. Может есть другие способы как это сделать?

    Код (Text):
    1. //обработка мессажа от хука WM_HOOK
    2. OpenClipboard(hWndDlg);
    3. EmptyClipboard();
    4.  
    5. hglbCopy = GlobalAlloc(GMEM_MOVEABLE,strlen(stData[wParam].szData)+1);
    6.  
    7. GlobalLock(hglbCopy);
    8. lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);
    9. memcpy(lptstrCopy,&stData[wParam].szData, strlen(stData[wParam].szData)+1);
    10. GlobalUnlock(hglbCopy);
    11.  
    12. SetClipboardData(CF_TEXT, hglbCopy);
    13. CloseClipboard();
    14.  
    15. GetCursorPos(&pt); hW=WindowFromPoint(pt);
    16. SendMessage(hW,WM_PASTE,0,0);