С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/28: Рейтинг темы: голосов - 28, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 17.09.2009
Сообщений: 7
1

HOOK + Эмуляция нажатия клавиш

17.09.2009, 16:31. Показов 5706. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть программа которая эмулирует нажатие клавиш

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
void CfgdfgDlg::OnBnClickedButton1()
{
    int Len, DropLen;
    CString buffDroped;
    WORD w;
 
    //Строка которую мы будем эмулировать
    buffDroped = TEXT("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    DropLen = buffDroped.GetLength();
 
    for (int i=0;i<DropLen;i++)
    {     
        Len = buffDroped.GetLength();
        if (Len>i)
        {
            w = VkKeyScan(buffDroped[i]);
            if ((HIBYTE(w) != 0xFF) && (LOBYTE(w) != 0xFF)) 
            {
                if (HIBYTE(w)) 
                {
                    keybd_event(VK_SHIFT, 0, 0, 0);
                    //Sleep(50);
                }
                keybd_event(LOBYTE(w),0,0,0);
                keybd_event(LOBYTE(w),0,KEYEVENTF_KEYUP,0);
                if (HIBYTE(w)) 
                {
                    keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
                }
            }
        }
    }
}
и программа которая ловит нажатие клавиш (HOOK)

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
HHOOK hKeyHook = NULL;
 
WORD GetSymbolFromVK(WPARAM wParam, UINT scanecode)
{
    BYTE btKeyState[256];
    HKL hklLayout = GetKeyboardLayout(0);    
    WORD Symbol = NULL;
    GetKeyboardState(btKeyState);
    if ((ToAsciiEx(wParam, scanecode, btKeyState, &Symbol, 0, hklLayout) == 1) &&
        (GetKeyState(VK_CONTROL) >= 0) && (GetKeyState(VK_MENU) >= 0)) 
        return Symbol;
    return -1;
}
 
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    WORD wc = 0;
 
    if (nCode >= HC_ACTION)
    { 
        //Если действие было - нажатие кнопочки
        if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
        {
            //Получаем символ
            if ((wc = GetSymbolFromVK(((PKBDLLHOOKSTRUCT)lParam)->vkCode, ((PKBDLLHOOKSTRUCT)lParam)->scanCode)) != -1)
            {
                //Проверяем если он печатемый
                if (iswprint(wc)) 
                {
                    //обработка символа
                }    
            }
        }
    }
    return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
}
 
BOOL SetKeyboardHook(BOOL Hook)
{
    HMODULE hInstance = GetModuleHandle(NULL);
 
    if (Hook) 
    {
        hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, hInstance, NULL);
        return (hKeyHook != NULL);
    } 
    else 
    {
        UnhookWindowsHookEx(hKeyHook);
        hKeyHook = NULL;
        return (hKeyHook != NULL);
    }
}
которые печатаются с клавишей "SHIFT" т.е.: !"№;%:?*() и тд.

Например если мы будем эмулировать строку !!23456789??
то наш hook ловит и преобразовывает их в символы !1@3456789/?
SHIFT пременился не для второго символа а для третьего и для предпоследнего он не применился(((, а если после эмуляции нажатия SHIFT поставить Sleep(50); то всё нормально. Но Sleep не есть good!! Как можно обойтись без Sleep и других задержек.
0
Programming
Эксперт
9485 / 562 / 19
Регистрация: 12.04.2006
Сообщений: 11,671
Блог
17.09.2009, 16:31
Ответы с готовыми решениями:

[Visual Studio C++] Имитация нажатия клавиш
Как программно нажимать клавиши? Пробовал так: #include &lt;windows.h&gt; keybd_event('C',...

MFC Dialog based, перехват нажатия клавиш
Нахожу в интернете, что для того чтобы перехватить нажатия клавиш клавиатуры нужно переопределить...

Глобальная эмуляция нажатия клавишь клавиатуры
В кратцe: Мне нежно что бы программа думала что я нажимаю кнопки на клавиатуре. sendinput - не...

Отслеживание нажатия клавиш на C++
Здравствуте, прочитал статью про то как перехватывать нажатие клавиш средствами...

4
2 / 2 / 0
Регистрация: 17.09.2009
Сообщений: 7
18.09.2009, 12:01  [ТС] 2
При перехвате нажатий клавиш с клавиатуры всё работает как надо, а при перехвате эмуляции клавиш иногда возникают проблемы с сиволами которые печатаются с клавишей "SHIFT" т.е.: !"№;%:?*() и тд.

Например если мы будем эмулировать строку !!23456789??
то наш hook ловит и преобразовывает их в символы !1@3456789/?
SHIFT пременился не для второго символа а для третьего и для предпоследнего он не применился(((, а если после эмуляции нажатия SHIFT поставить Sleep(50); то всё нормально. Но Sleep не есть good!! Как можно обойтись без Sleep и других задержек.
0
Эксперт С++
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
18.09.2009, 12:23 3
Я просто использовал VkKeyScan и на эмуляцию шифта вообще забивал.

Добавлено через 39 секунд
Код
keybd_event(VkKeyScan(str[i]), 0,0,0);
keybd_event(VkKeyScan(str[i]), 0,KEYEVENTF_KEYUP,0);
Как-то так.Давно это было.И работало
1
2 / 2 / 0
Регистрация: 17.09.2009
Сообщений: 7
18.09.2009, 14:05  [ТС] 4
Эмуляцию делает не моя программа, а сторонних разработчиков, к её исходникам у меня доступа нет. Я просто привел пример как эмулируются нажатия.
А мне надо перехватить эти нажатия, но вот не знаю как это исправить.
0
2 / 2 / 0
Регистрация: 17.09.2009
Сообщений: 7
23.09.2009, 13:13  [ТС] 5
Нашёл в чем дело. Проблема была в функции GetKeyboardState().

Замечания к функии
Прикладная программа может вызвать эту функцию, чтобы извлечь данные о текущем состоянии всех виртуальных клавиш. Состояние изменяется тогда, когда поток удаляет сообщения клавиатуры из ее очереди сообщений. Состояние не изменяется тогда, когда сообщения клавиатуры посланы в очередь сообщений.


Видимо поток не успевал удалять сообщение из очереди.
Решил это так


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
void ProcessMessage() 
{ 
    MSG msg; 
    while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
        if(GetMessage(&msg, NULL, 0, 0)) 
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
        else 
            return; 
    } 
}
 
WORD GetSymbolFromVK(WPARAM wParam, UINT scanecode)
{
    BYTE btKeyState[256];
    HKL hklLayout = GetKeyboardLayout(0);   
    TCHAR Symbol = NULL;
 
    //LoadKeyboardLayout(TEXT("00000409"), KLF_ACTIVATE);
    ProcessMessage();
    GetKeyboardState(btKeyState);
    if ((ToUnicodeEx(wParam, scanecode, btKeyState, &Symbol, 1, 0, hklLayout) == 1) && // сам перевод
        (GetKeyState(VK_CONTROL) >= 0) && (GetKeyState(VK_MENU) >= 0)) 
    {
        return Symbol;
    }
    return -1;
}
1
23.09.2009, 13:13
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
23.09.2009, 13:13
Помогаю со студенческими работами здесь

Перехватчик клавиш + эмуляция нажатия клавиш
Здравствуйте! Срочно нужна помощь! Моя программа работает в фоновом режиме. Мне нужно: 1) чтобы...

Глобальный Hook - отлов нажатия одной из клавиш
Добрый вечер! Извините за ламерский вопрос. Проблема заключается в следующем. Мне нужно что бы...

Эмуляция нажатия клавиш
Люди, задам может быть тупой вопрос, но возможно ли программно в jquery или js эмулировать нажатия...

Эмуляция нажатия клавиш
помогите с кодом разобраться, не работает( Var PWD, Login : String; procedure...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Блоги программистов
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(шес­­­­­­­­­­­­­­­ти­б­и­т­н­ы­й асихронный счётчик с управляющим сигналом заде
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
Angular vs React vs Vue.js
BasicMan 03.01.2025
О, друзья-разработчики и просто любопытные читатели! Сегодня мы отправимся в увлекательное путешествие по миру фронтенд-разработки, и первой остановкой станет Angular – этакий строгий немецкий. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru