Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: N0mad   (18.09.2009 в 11:58)
Есть программа которая эмулирует нажатие клавиш


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


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: