Не работает SetWindowsHookEx

Тема в разделе "WASM.BEGINNERS", создана пользователем AndreyXYZ, 12 фев 2009.

  1. AndreyXYZ

    AndreyXYZ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2009
    Сообщения:
    28
    Пишу на C++. Необходимо перехватывать сообщения WM_LBUTTONDOWN. Пытаюсь воспользоваться Hook'ами. Взял пример из MSDN, вырезал всё лишнее и получил следующий код.
    Код (Text):
    1. LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    2. {
    3.     printf("Сообщение от мыши");
    4.     return 0;
    5. }
    6.  
    7. int _tmain(int argc, _TCHAR* argv[])
    8. {
    9.     HOOKPROC hkprcSysMsg;
    10.     static HINSTANCE hinstDLL;
    11.     static HHOOK hhookSysMsg;
    12.  
    13.     hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");
    14.     hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "MouseProc");
    15.     hhookSysMsg = SetWindowsHookEx(WH_MOUSE,hkprcSysMsg,hinstDLL,0);
    16.     getch();//бесконечный цикл ожидания
    17. }
    Но код не работает. Функция MouseProc никогда не вызывается. Пробовал вызывать SetWindowsHookEx следующим образом:
    Код (Text):
    1. SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,NULL);
    Не помогло.
     
  2. AndreyXYZ

    AndreyXYZ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2009
    Сообщения:
    28
    В строчке hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll"); ошибка
    ERROR_MOD_NOT_FOUND
    126 The specified module could not be found
     
  3. barton

    barton New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2008
    Сообщения:
    164
    Адрес:
    Czechoslovakia
    Ну DLL-ки такой нет в (C:\windows\sysmsg.dll), дык в чем проблема то?
     
  4. AndreyXYZ

    AndreyXYZ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2009
    Сообщения:
    28
    ТО есть нужно создать dll, в которой будет храниться код функции MouseProc? А нельзя ли обойтись без этого?
     
  5. AndreyXYZ

    AndreyXYZ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2009
    Сообщения:
    28
    При выполнении SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,NULL); возникает ошибка ERROR_HOOK_NEEDS_HMOD
    1428
    0x594
    Cannot set nonlocal hook without a module handle.
    Почему?
     
  6. um0v

    um0v New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    32
    Важная деталь относительно удаленных хуков: хук-пpоцедуpа должна находиться в DLL, котоpая будет пpомэппиpована в дpугой пpоцесс

    Простейший пример можно посмотреть у iczelion'a
     
  7. AndreyXYZ

    AndreyXYZ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2009
    Сообщения:
    28
    Мне удалось создать dll и загрузить её, но не удается получить адрес моей функции в dll.
    Код (Text):
    1. #include "stdafx.h"
    2. #include <stdio.h>
    3.  
    4.  
    5. #ifdef _MANAGED
    6. #pragma managed(push, off)
    7. #endif
    8.  
    9. BOOL APIENTRY DllMain( HMODULE hModule,
    10.                        DWORD  ul_reason_for_call,
    11.                        LPVOID lpReserved
    12.                      )
    13. {
    14.     return TRUE;
    15. }
    16.  
    17. extern LRESULT CALLBACK MouseProc(          
    18.     int nCode,
    19.     WPARAM wParam,
    20.     LPARAM lParam
    21. )
    22. {
    23.     printf("ABC");
    24.     return 0;
    25. }
    26.  
    27. #ifdef _MANAGED
    28. #pragma managed(pop)
    29. #endif
    Правильный ли код у dll?
    Функция GetProcAddress(hinstDLL, "MouseProc"); возвращает 0. Ошибка: не найдена функция.
     
  8. AndreyXYZ

    AndreyXYZ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2009
    Сообщения:
    28
    Добавил перед именем функции __declspec (dllexport). Не помогло!
     
  9. AndreyXYZ

    AndreyXYZ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2009
    Сообщения:
    28
    Получилось загрузить dll. Код функции MouseProc
    Код (Text):
    1.     if (wParam==WM_LBUTTONDOWN)
    2.     {
    3.         MessageBeep(0xffffffff);
    4.         printf("ABC");
    5.     }
    При клике мышкой гудок есть, но в консоли ничего не выводится. Это и понятно: ведь dll про мою консоль ничего не знает!
    Изначально цель проекта заключалась в том, чтобы при нажатии на левую кнопку мыши выводился хендл окна, на котором стоит курсор. Но я не хочу выводить это в файл. Как сделать, чтобы все по-нормальному выводилось в мою консоль? Помогите, пожалуйста!
     
  10. CodeGrinder

    CodeGrinder New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    56
    Самое простое - возвращать (передавать) строку вызывающему модулю, пускай он выводит.
    Можно попробовать поиграться с GetConsoleCP и т.п.
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.317
    никогда не любил хуки... сплайсинг то поинтереснее будет)))))
     
  12. ChugunovDima

    ChugunovDima New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    2
    Полный код в студию, пожалуйста. А то пишите, пишите, и даже не дадите нормальный код, у меня не находит саму процедуру в библиотеке, не знаю как правильно объявить