(c++) Работа с Win Api, ХУКАМИ. Компилирую в Vs

Тема в разделе "MS Visual C++", создана пользователем stribogaaa, 11 май 2010.

  1. stribogaaa

    stribogaaa Гость

    У меня есть два проекта, один Dll библиотека, второй исполняемый файл

    Примерная схема библиотеки:
    Код (Text):
    //------------------------------------------
    #pragma data_seg(".hdata") // секция в памяти общая для всех процессов
    HINSTANCE hi=NULL;
    #pragma data_seg() // конец секции
    #pragma comment(linker, "/section:.hdata,rws")

    HHOOK hKeyHook=NULL;
    HHOOK hCBTHook=NULL;

    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if (nCode) return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
    if(lParam>=0) DoNextAction(lParam);
    return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
    }

    LRESULT WINAPI CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    if(nCode==HCBT_ACTIVATE) // вызывается перед тем как система собирается активировать какоето окно или открыть новое
    DoNextAction2((HWND)wParam);
    return CallNextHookEx(hCBTHook, nCode, wParam, lParam);
    }

    extern "C" __declspec (dllexport) BOOL SetKeyboardHook(void)
    {
    hCBTHook=SetWindowsHookEx(WH_CBT ,CBTProc, hi, 0);
    hKeyHook=SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hi, 0);
    return hKeyHook;
    }

    //------------------------------
    Содержание исполняемого файла:
    Код (Text):
    //------------------------------
    extern "C" __declspec (dllimport) BOOL SetKeyboardHook(void);    // функция импортируемая из DLL

    //----- функция вызова
    if(!SetKeyboardHook()) // устанавливаем хуки
    return 1; // не получилось закрываемся
    //--------
    Дак вот, почему не удается установить хук??

    И если у меня нету в исполняемом файле нет главного окна, то будет ли WH_KEYBOARD обрабатывать нажатия клавиатуры? Может нужно использовать WH_KEYBOARD_LL ?

    WH_CBT Вообще не происходит....Почему?

    Возможно WH_CBT и WH_KEYBOARD должны быть описаны в исполняемом файле?? (я о функция соотвецтвующих хукам)

    У меня KeyboardProc CBTProc описаны в самой библиотеке, это правильно?

    Если я хочу перехватывать допустим все события клавиатуры, будет ли мне их выдавать WH_KEYBOARD ?? или необходимо использовать WH_KEYBOARD_LL ??
     
  2. stribogaaa

    stribogaaa Гость

    Я инициализирую hi при регистрации длл.

    Код (Text):
    BOOL APIENTRY DllMain(HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
    {
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
    if(!hi) // запоминаем запустивший хэндл
    hi=hModule; // дескриптор модуля DLL

    .................
    }
    }
    }
     
  3. stribogaaa

    stribogaaa Гость

    Мёртвый форум.......
     
  4. etc

    etc Гость

    Не то слово...
     
  5. AtHeaven

    AtHeaven Гость

    Видимо потому, что hi == NULL.
    Проинициализируй hi валидным дескриптором в DllMain.
     
  6. stribogaaa

    stribogaaa Гость

    А чем это плохо?

    Код (Text):
                if(!hi) // запоминаем запустивший хэндл
    hi=hModule; // дескриптор модуля DLL
     
Загрузка...
Похожие Темы - (c++) Работа Win
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    28
  2. Hoasker
    Ответов:
    0
    Просмотров:
    64
  3. garri671
    Ответов:
    0
    Просмотров:
    55
  4. lelik200969
    Ответов:
    0
    Просмотров:
    52
  5. Kozolick
    Ответов:
    0
    Просмотров:
    141

Поделиться этой страницей