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

  • Автор темы stribogaaa
  • Дата начала
S

stribogaaa

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

Примерная схема библиотеки:
Код:
//------------------------------------------
#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;
}

//------------------------------
Содержание исполняемого файла:
Код:
//------------------------------
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 ??
 
S

stribogaaa

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

Код:
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

.................
}
}
}
 
A

AtHeaven

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