Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2

Hook не работает

13.11.2014, 00:04. Показов 2177. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
Решил разобраться с хуками и немного с dll. Вот чего набодяжил:
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
#include <Windows.h>
#include <cstdio>
 
 
int main()
{
    HHOOK hook;
    HOOKPROC hookfunc;
    HINSTANCE hDLL = LoadLibrary(L"Hookdll.dll");
    if(hDLL == NULL)
    {
        printf("LoadLibrary Error %d", GetLastError());
    }
    else
    {
        hookfunc = (HOOKPROC)GetProcAddress(hDLL,"KeyboardProc");
        if(hookfunc)
        {
            hook = SetWindowsHookEx(WH_KEYBOARD, hookfunc, hDLL, NULL);
            if(hook == NULL)
                printf("SetWindowsHookEx Error %d", GetLastError());
        }
        else
        {
            printf("GetProcAdress Error %d", GetLastError());
        }
    }
    while(true) {}
}

Код для dll

dllmain.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

functions.h
C++
1
2
3
4
5
#include <Windows.h>
#include <cstdio>
#pragma comment(lib, "User32.lib")
 
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

functions.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "Functions.h"
 
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    FILE* f;
    if(f = fopen("d:\\log.log","a"))
    {
        fputc(MapVirtualKey(wParam,2),f);
        fclose(f);
    }
    return CallNextHookEx(NULL, code, wParam, lParam);
}

Это код не работает. Программа выводит вот что: GetProcAdress Error 127 (The specified procedure could not be found).
Что здесь неправильно? Почему GetProcAdress не может найти KeyboardProc?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.11.2014, 00:04
Ответы с готовыми решениями:

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

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

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

8
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
13.11.2014, 00:10
Вроде __declspec(dllexport) надо и *.cpp указывать перед функцией
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
13.11.2014, 00:12  [ТС]
Цитата Сообщение от Cra3y Посмотреть сообщение
Вроде __declspec(dllexport) надо и *.cpp указывать перед функцией
В смысле это и в файле *.cpp попробовать указать?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
13.11.2014, 00:13
в 64х битной системе понадобится 2 версии библиотеки 32 и 64 бита
Иначе подгружаться будет либо только в 32 программы, либо в 64
1
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
13.11.2014, 00:16  [ТС]
Мне бы оно хоть под 32 бита заработало бы, а дальше уже - посмотрим
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
13.11.2014, 00:18
Цитата Сообщение от Dani Посмотреть сообщение
В смысле это и в файле *.cpp попробовать указать?
да
вот откопал у себя
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
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
#include <windows.h>
#include "../shared/shared.h"
#pragma comment(linker,"/entry:DllMain")
 
#define XHOOK_API __declspec(dllexport)
 
#ifndef UINT_MAX
#define UINT_MAX 0xffffffff
#endif
 
#ifndef SPI_GETWHEELSCROLLLINES
#define SPI_GETWHEELSCROLLLINES 104
#endif
 
#ifndef WHEEL_PAGESCROLL
#define WHEEL_PAGESCROLL (UINT_MAX)
#endif
 
#ifndef WM_MOUSEWHEEL
#define WM_MOUSEWHEEL 0x020A
#endif
 
extern "C"
{
    XHOOK_API void Release(HINSTANCE xmod);
    //XHOOK_API LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);
    XHOOK_API void Init(HINSTANCE xmod);
};
 
HINSTANCE xmod;
HHOOK xhook;
 
 
void OutError()
{
    LPVOID lpMsgBuf;
    DWORD err=GetLastError();
    //if(!err)return;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        err,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0,NULL);
    MessageBox( NULL,(LPTSTR)lpMsgBuf, "Error", MB_ICONINFORMATION );
    LocalFree( lpMsgBuf );
    SetLastError(0);
}
 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  if(fdwReason==DLL_PROCESS_ATTACH)
  {
    xmod=hinstDLL;
    xhook=0;
    if(!xmod)OutError();
  }
  return TRUE;
}
 
XHOOK_API void Release(HINSTANCE xmod)
{
  UnhookWindowsHookEx(xhook);
}
#ifdef hwnd_to_file
HWND GetMainWindow()
{
    const char tmpset[]="c:\\tmpset.qls";
    HWND main=NULL;
    HANDLE f=CreateFile(tmpset,GENERIC_READ,0,NULL,
                        OPEN_EXISTING,0,NULL);
    if(f)
    {
        DWORD sr;
        ReadFile(f,&main,sizeof(HWND),&sr,NULL);
        CloseHandle(f);
    }
    return main;
}
#else
#define GetMainWindow() FindWindow(ql_class,title)
#endif
 
#ifdef _WHEELTOSCROLL
void WheelToScroll(PMSG msg)
{
    short zDelta;
    UINT wlines;
    WORD umsg;
 
    if(!SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0,&wlines,0)) wlines=3;
    zDelta = (short) HIWORD(msg->wParam);
    msg->message=WM_VSCROLL;
    if(wlines==WHEEL_PAGESCROLL)
    {
        if(zDelta>0)
        {
            umsg=SB_PAGEUP;
        }
        else
        {
            umsg=SB_PAGEDOWN;
        }
    }
    else
    {
        if(zDelta>0)
        {
            umsg=SB_LINEUP;
        }
        else
        {
            umsg=SB_LINEDOWN;
        }
    }
    msg->wParam=MAKEWPARAM(umsg,0);
    msg->lParam=NULL;
}
#else
#define WheelToScroll(msg) do{;}while(0)
#endif
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    short zDelta;
    UINT wlines;
    WORD umsg;
    HWND main=NULL;
    if(nCode==HC_ACTION)
    {
    PMSG msg=(PMSG)lParam;
    POINT pt;
    switch(msg->message)
    {
      case WM_MBUTTONDOWN:
      case WM_NCMBUTTONDOWN:
        msg->message=WM_NULL;
        return 0;
      case WM_MBUTTONUP:
      case WM_NCMBUTTONUP:
        GetCursorPos(&pt);
        main=GetMainWindow();
        if(IsWindow(main))
        {
            SendMessage(main,msg->message,0,MAKELPARAM(pt.x,pt.y));
            msg->message=WM_NULL;
        }
        return 0;
      case WM_MOUSEWHEEL:
        if(InSendMessage()) return 0;
        if(GetAsyncKeyState(VK_MENU)!=0) return 0;
        umsg=LOWORD(msg->wParam);
        if(umsg==MK_CONTROL)
        {
          if(!SystemParametersInfo(SPI_GETWHEELSCROLLLINES,0,&wlines,0)) wlines=3;
          zDelta = (short) HIWORD(msg->wParam);
          msg->message=WM_HSCROLL;
          if(wlines==WHEEL_PAGESCROLL)
          {
            if(zDelta>0)
            {
              umsg=SB_PAGEUP;
            }
            else
            {
              umsg=SB_PAGEDOWN;
            }
          }
          else
          {
            if(zDelta>0)
            {
              umsg=SB_LINEUP;
            }
            else
            {
              umsg=SB_LINEDOWN;
            }
          }
          msg->wParam=MAKEWPARAM(umsg,0);
          msg->lParam=0;//NULL;
        }
        else if(umsg!=0)
        {
          return 0;
        }
        else WheelToScroll(msg);
 
        POINT pt;
        GetCursorPos(&pt);
        main=WindowFromPoint(pt);
        if(main!=msg->hwnd)
        {
          SetForegroundWindow(main);
          SetActiveWindow(main);
          SendMessage(main,msg->message,msg->wParam,msg->lParam);
          msg->message=WM_NULL;
        }
        return 0;
      default: break;
    }
    }
    return CallNextHookEx(xhook,nCode,wParam,lParam);
}
 
XHOOK_API void Init(HINSTANCE xmod)
{
  xhook=SetWindowsHookEx(WH_GETMESSAGE,HookProc,xmod,0);
  if(!xhook)
  {
    OutError();
    MessageBeep(IDOK);
  }
}
подключение
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
bool hooked = false; // флаг перехватчика
HMODULE lib = 0;     // истанс библиотеки перехвата
NOTIFYICONDATA nid;  // описание иконки в трее
 
proc Init = NULL;    // указатель на инициализацию перехватчика
proc Release = NULL; // свобождение перехватчика
 
/*/
    Немного магии)
    если макрос определен, то инстанс окна сохраняетс в корне диска С
    иначе определяются заглушки
/*/
 
#ifdef hwnd_to_file
const char tmpset[] = "c:\\tmpset.qls";
void StoreHWND(HWND hwnd) {
    HANDLE f = CreateFile(tmpset, GENERIC_WRITE, 0, NULL,
                          CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
    DWORD sw;
    WriteFile(f, &parent, sizeof(HWND), &sw, NULL);
    CloseHandle(f);
}
#define FreeHWND() DeleteFile(tmpset)
#else
#define StoreHWND(xhwnd) do{;}while(0)
#define FreeHWND() do{;}while(0)
#endif
 
// установка перехватчика
void Hook(HWND parent) {
    char modpath[MAX_PATH];
    if (!hooked) {
        GetModulePath(hApplication, modpath, MAX_PATH);
        lstrcat(modpath, "xcontrols.dll");
        lib = LoadLibrary(modpath);
        if (!lib) goto eExit;
        Init = (proc)GetProcAddress(lib, "Init");
        if (!Init) goto eQuit;
        Release = (proc)GetProcAddress(lib, "Release");
        if (!Release) goto eQuit;
        StoreHWND(parent);
        Init(lib);
        hooked = true;
    }
    return ;
eQuit:
    FreeLibrary(lib);
    Init = NULL;
    Release = NULL;
    hooked = false;
eExit:
    MessageBeep(MB_ICONEXCLAMATION);
    OutError();
}
Добавлено через 1 минуту
по крайней мере 7 лет назад код работал
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
13.11.2014, 00:36  [ТС]
Не, не помогает.

Решил полностью объявление скопировать
Новый functions.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "Functions.h"
 
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    FILE *f; // Указатель на файл
    if((f=fopen("d:\\logfile.log","a"))!=NULL)
    {
        fputc(MapVirtualKey(wParam,2),f);
        fclose(f);
    }
    return CallNextHookEx(NULL, code, wParam, lParam);
}


Добавлено через 16 минут
У меня в Total Commandere есть такая штука в Listere, что можно посмотреть список функций, которые экспортирует dll. Имя KeyboardProc оказалось _KeyboardProc@12. Я поменял в программе main.cpp имя функции на такое и все заработало (глючит правада сильно, но это уже не сегодня разбираться). Почему такое имя у функции получилось?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
13.11.2014, 00:40
из за LRESULT CALLBACK по моему.
не зря я тогда хук в самой длл устанавливал, а имтортировал функции установки снятия
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,215
13.11.2014, 03:23
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Цитата Сообщение от Dani Посмотреть сообщение
Почему такое имя у функции получилось?
Ожидать, что имя функции будет впрямую "как в программе" было бы наивно. Все внешние имена подвераются "декорации" для линкера.

Минимиальная декорация - это добавление '_' перед именем функции. Такая декорация применяется к C функциям, вызываемым через __cdecl соглашение вызова. Хотите такую декорацию - объявляйте свою функцию как 'extern "C" __cdecl'. И в этом случае надо будет делать 'GetProcAddress(hDLL,"_KeyboardProc")'.

С функции, вызываемые через соглашение __stdcall декорируются '_' перед именем функции и '@nnn' после имени, где nnn - количество байтов в аргументах функции. Это вы и наблюдаете.

Назначить свои имена экспортируемым функциям можно либо через отдельный файл экспорта (т.наз DEF файл), либо через опцию /EXPORT линкера в формате '/EXPORT:KeyboardProc=_KeyboardProc@12'. Последнюю можно указать прямо в исходнике DLL через

C++
1
#pragma comment(linker, "/EXPORT:KeyboardProc=_KeyboardProc@12")
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2014, 03:23
Помогаю со студенческими работами здесь

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

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

Простой dll hook не работает
Доброго времени суток! Идея: прога вставляет строку меню в открытый Notepad и по выбору этого пункта меню появляется MessageBox. ...

Hook в myCRED работает наполовину -_-
всем привет. я здесь пока новенький и очень рад тому что позволяете новеньким писать) у меня проблема вот такая: если знаете, myCRED...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru