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

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

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


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

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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
Эксперт С++
2250 / 765 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2009, 13:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.