С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811

функция SetWindowsHookEx

12.03.2016, 10:50. Показов 4825. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал небольшую прогу для теса функции:
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
#include "stdafx.h"
#include "Keylog.h"
 
MSG msg;
std::string str;
 
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
 
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
    SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, NULL);
    while ( GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);//обработка ввода данныхт с клаиатуры
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    WORD BufChar;        // buffer for translated key
    UINT uScanCode = MapVirtualKey(wParam, 0);
    BYTE KeyState[256];  // key-state array
    UINT uFlags = 0;
    GetKeyboardState(KeyState); // заносим состояние всех клавиш
 
    switch ( code )
    {
    case HC_ACTION:
        switch ( wParam )
        {
        case  WM_KEYUP:
            ToAscii(lParam, uScanCode, KeyState, &BufChar,uFlags);
            str  += BufChar;
            MessageBox(NULL, str.c_str(), "hehe", 0);
            break;
        default:
            break;
        }   
        break;
    default:
        break;
    }
    return 0;
}
Но в сообщении выводится всегда буква М.. где ошибка? не могу понять....
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.03.2016, 10:50
Ответы с готовыми решениями:

SetWindowsHookEx + Firefox
Ставлю Hook на Firefox DWORD dwProcessID = 0, AA; DWORD dwThreadID = GetWindowThreadProcessId((HWND)0x1708B4, &dwProcessID);//там...

SetWindowsHookEx и WM_CREATE
Доброе утро. Необходимо отлавливать создание окон по их заголовкам. Есть файл config.cfg, в котором находится список с заголовками окон...

SetWindowsHookEx - чем вызвать?
сабж. есть программа, перехват осуществляется функцией указанной в сабже. каким образом можно вызывать её? keybd/mouse_event не...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
12.03.2016, 13:13
С чего это uScanCode получается из wParam? Вообще-то нужно лезть в ((LPKBDLLHOOKSTRUCT)lParam)->vkCode
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
12.03.2016, 14:35  [ТС]
Вот переделал:
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
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    std::fstream myfile;//создание файла для записи
    DWORD vk;
    char txt[256];
    switch ( code )
    {
    case HC_ACTION:
        switch ( wParam )
        {
        case  WM_KEYDOWN:
            vk = ((LPKBDLLHOOKSTRUCT)lParam)->vkCode;
            //_stprintf(txt, ("0x%05x"), vk);
            //MessageBox(NULL, txt, _T("Код:"), 0);
            if (vk != 0x00020 && vk != 0x0000d )//нажат пробел или интер
            str += vk;
            else
            {
                str += '\n';
                myfile.open("Log.txt", std::ios_base::out | std::ios_base::app); //открытие файла для записи 
                if ( myfile.is_open() )//переписываем весь файл
                {
                    myfile << str.c_str();
                }
                myfile.close();
                str.clear();//очистка строки
            }
            break;      
        }   
        break;  
    }
    return 0;
}
Правильное направление?
По ходу возникло несколько вопросов: коды выводятся именно кнопок и не различаются русский шрифт или нет, а также регистр .... как их различать?
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
15.03.2016, 09:03  [ТС]
Объясните почему не вызывается функция обработки если написать так:
C++
1
SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, NULL);
или
C++
1
SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, NULL, NULL);
в данной программе.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
15.03.2016, 10:24
Потому что для всех хуков, кроме _LL (WH_KEYBOARD_LL и WH_MOUSE_LL) нужна DLL-ка, а ее у тебя нет.
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
15.03.2016, 11:03  [ТС]
т.е.
C++
1
SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, NULL);
надо разместить в DLL?
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
16.03.2016, 20:48  [ТС]
Написал небольшой тест....
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
#include "stdafx.h"
#include "KeyLog_1.2.h"
 
typedef void(*PRINT)();
 
// Глобальные переменные:
HINSTANCE hinstDLL;
MSG msg;// текущий экземпляр
HOOKPROC hkprc;
HHOOK hhook;
PRINT printFunksion;
// Отправить объявления функций, включенных в этот модуль кода:
 
 
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR    lpCmdLine, _In_ int nCmdShow)
{   
    
    hinstDLL = LoadLibrary("Win32Project2.dll");
    if ( hinstDLL == NULL)
        MessageBox(NULL, "DLL не загружена", "dll", NULL);
    hkprc = (HOOKPROC)GetProcAddress(hinstDLL, "GetMsgProc");
    if ( ! hkprc )
        MessageBox(NULL, "функция GetMsgProc не найдена", "dll", NULL);
    printFunksion = (PRINT)GetProcAddress(hinstDLL, "Print");
    if (! printFunksion )
    {
        MessageBox(NULL, "функция не найдена", "dll", NULL);
    }
    printFunksion();
    hhook = SetWindowsHookEx(WH_GETMESSAGE, hkprc, (HINSTANCE)hinstDLL,0);
    // Цикл основного сообщения:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, NULL, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (int) msg.wParam;
}
вот 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
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
 
 
#pragma comment(linker, "/def:DLL.def") // Указание линкеру добавить список экспорта
extern "C" _declspec(dllexport) void Print();
extern "C" _declspec(dllexport) LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam);
 
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;
}
 
 
void Print()
{
    MessageBox(NULL, "DLL", "dll", NULL);
}
 
LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
{
    MessageBox(NULL, "GetMsgProc", "dll", NULL);
    return 0;
}
так функция с dll
C++
1
void Print()
выполняется а
C++
1
 LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
нет... срабатывает проверка
C++
1
2
if ( ! hkprc )
        MessageBox(NULL, "функция GetMsgProc не найдена", "dll", NULL);
Где ошибка?...... вроде все как в примерах.....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.03.2016, 20:48
Помогаю со студенческими работами здесь

Проверка движения мыши с SetWindowsHookEx
class MouseHook { public: static MouseHook&amp; Instance() { static MouseHook myHook; return myHook; }

Срабатывание хука по SetWindowsHookEx(WH_KEYBOARD, ...)
КАК ХУКИ ОПРЕДЕЛИТЬ ПРИ ЭТОМ ЧТОБ НАПРИМЕР ПРИ НАЖАТИИ 1 В ЛЮБОМ ПРИЛОЖЕНИЕ ИГРАЛСЯ ВЕЙВ ФАЙЛ? Я ХУК ОПРЕДЕЛИЛ...

Назначение третьего параметра в SetWindowsHookEx
Создаю хук в консольном приложении, что передать в 3 аргументе функции (должен указатель на DLL) HHOOK hook =...

Создание BOOL функции для SetWindowsHookEx
Я хочу создать функцию на C++ будет возвращать TRUE / FALSE в зависимости от того что вернул SetWindowsHookEx Проблема в том что я не...

Изъезженная тема про SetWindowsHookEx и WH_JOURNALPLAYBACK/WH_JOURNALRECORD
Привет всем. Я хочу сделать макрос, считывающий сообщения какого-либо приложения и потом эти сообщения воспроизводящий для этого же...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru