HOOK + Эмуляция нажатия клавиш
От: N0mad  
Дата: 16.09.09 12:00
Оценка: 3 (1) +1
Есть программа которая эмулирует нажатие клавиш



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)


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 и других задержек.

16.09.09 20:59: Перенесено модератором из 'C/C++' — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.