Форум программистов, компьютерный форум CyberForum.ru

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Olejik7
10 / 10 / 6
Регистрация: 17.02.2014
Сообщений: 58
#1

WH_DEBUG в SetWindowsHookEx не срабатывает - C++ WinAPI

10.01.2017, 21:53. Просмотров 133. Ответов 0
Метки нет (Все метки)

Код в DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include "stdafx.h"
    #pragma data_seg(".hdata") // секция в памяти общая для всех процессов
    HINSTANCE hi = NULL; // эта переменная может изменяться любым поэтому здесь не должно быть ничего лишнего
    #pragma data_seg() // конец секции
    #pragma comment(linker, "/section:.hdata,rws") // даем права этой секции
    HHOOK hKeyHook = NULL;
    BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if (!hi) // запоминаем запустивший хэндл(наша DLL) толко первый раз, чтобы он небыл переписан на новый
        hi = hModule;
    return TRUE;
}
 
extern "C" __declspec(dllexport) LRESULT CALLBACK DebugProc(int nCode, WPARAM wParam, LPARAM lParam) // вызывается при нажатии или отпускании клавиши
{
    if (nCode == HC_ACTION && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)) { // нам нужно только нажатие
        printf("Замечен кейлогер - ");
    }
    return CallNextHookEx(hKeyHook, nCode, wParam, lParam);     // обработали передаем дальше
}
extern "C" __declspec(dllexport) int SetKeyboardHook(void)
{
    hKeyHook = SetWindowsHookEx(WH_DEBUG, &DebugProc, hi, 0);
    return 1;
}
    // конец DLL
Код программы, вызывающей DLL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <locale>
    #include <windows.h>
    
    INT main() {
        setlocale(LC_ALL, "russian");
    HOOKPROC hookfunc;
    LPWSTR name = L"dllmain.dll";
    HMODULE hDLL = LoadLibrary(name);
    hookfunc = (HOOKPROC)GetProcAddress(hDLL, "DebugProc");
    hook = SetWindowsHookExW(WH_DEBUG, hookfunc, LoadLibrary(name), 0);
    while (1) {
    }
        system("pause");
        ExitProcess(0);
    }
Хук из DLL почему-то не срабатывает, хотя должен быть. SetHook() возвращает все как надо, ошибок нет. Почему хук не ставится в DLL? Делал всё по примеру(http://uinc.ru/articles/zametki/001.shtml) (естественно, заменяя нужные моменты). Как нужно изменить код, чтобы хук ставился и отлавливал все WH_KEYBOARD(используется WH_DEBUG и структура PDEBUGHOOKINFO)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 21:53     WH_DEBUG в SetWindowsHookEx не срабатывает
Посмотрите здесь:

C++ WinAPI Win32 API Не срабатывает WM_KEYDOWN
C++ WinAPI Почему не срабатывает WM_TIMER, и изображение не перерисовывается?
SetWindowsHookEx + Firefox C++ WinAPI
Не срабатывает хук WH_GETMESSAGE C++ WinAPI
Не срабатывает событие WM_UNICHAR C++ WinAPI
C++ WinAPI SetWindowsHookEx и WM_CREATE
Двойная буферизация (не срабатывает BitBlt) C++ WinAPI
Не срабатывает инжект в 64-битные процессы C++ WinAPI
При загрузке Dll MessageBox срабатывает 2 раза C++ WinAPI
C++ WinAPI функция SetWindowsHookEx
C++ WinAPI SetWindowsHookEx - чем вызвать?
C++ WinAPI Назначение третьего параметра в SetWindowsHookEx

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 06:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru