Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с хуком WH_CBT

19K
27 июля 2006 года
ZERO_BiT
1 / / 27.07.2006
Здравствуйте!
Мне нужно отлавливать хэндлы всех создаваемых в системе окон. Для этой цели использую глобальный хук WH_CBT. Вот код:

DLL:
Код:
HWND hMainWnd = NULL;
HINSTANCE hInst;
HHOOK hHook;

extern "C" __declspec(dllexport) LRESULT BlenderHook(int nCode, WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) bool SetHook(bool bSet);

BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hMainWnd = FindWindow(L"BlenderWnd", NULL);
        hInst = hModule;
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) LRESULT BlenderHook(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HCBT_CREATEWND)
    {
        if (hMainWnd)
            SendMessage(hMainWnd, WM_USER + 103, wParam, NULL);
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

extern "C" __declspec(dllexport) bool SetHook(bool bSet)
{
    if (bSet)
    {
        hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)BlenderHook, hInst, 0);
        if (hHook)
            return true;
    }
    else
        return UnhookWindowsHookEx(hHook);
    return false;
}

BlenderHook - хуковая процедура, SetHook - ставит/снимает хук.

Основная прога:
Код:
typedef bool (*MyProc)(bool);

HMODULE hLib = NULL;
MyProc hProc = NULL;
HHOOK hHook = NULL;
...
hLib = LoadLibrary(L"BlenderHook.dll");
if (!hLib)
    MessageBox(L"Не удалось загрузить библиотеку BlenderHook.dll. Где-то косяк :(", L"Косяк :(", MB_ICONHAND);
else
{
    hProc = (MyProc)GetProcAddress(hLib, "SetHook");
    if (!hProc)
        MessageBox(L"Не удалось получить указатель на процедуру установки хука.", L"Косяк :(", MB_ICONHAND);
    else
        UIEnable(ID_ACTIVATE, true);
}
...
if (!hProc(true))
{
    MessageBox(L"Не удалось установить хук.", L"Косяк :(", MB_ICONHAND);
    return 0;
}

Хук ставится нормально, то есть никаких ошибок не вылезает.
Для теста нажимаю "Пуск" (создаётся окно). Мессага в главную прогу не приходит, explorer.exe радостно падает :( Пытаюсь установить фокус на какое-нибудь окно - его процесс радостно падает :(
В чём, кроме ДНК, может быть проблема?
9.7K
28 июля 2006 года
DaemonDZK
59 / / 08.11.2005
1.
...
return CallNextHookEx(NULL, nCode, wParam, lParam);
...

Первым параметром передаеться HANDLE хука, но никак не NULL.

2. Не используй SendMessage. Explorer будет падать по непонятным причинам. PostMessage тебе поможет.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог