Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > коды клавиш клавиатуры


Автор: vol4ek 12.12.2011, 10:42
Всем привет. Написал программу которая эмулирует нажатие клавиш на клавиатуре в определённой последовательности. Все прекрасно работает, проблема с клавишами F1-F12 как их нажать? Клавише F1 соответствует код 112 но нажатия не происходит. Остальные клавиши работают прекрасно.

Код

#include <windows.h>

DWORD SendScanCode(WORD scan, BOOL up)
// посылает нажатие или отпускание клавиши со сканкодом scan
// если up == TRUE то это событие отпускания, иначе нажатия
// возвращает NO_ERROR в случае успеха или код ошибки 
{
    INPUT inp = {0};
    inp.type = INPUT_KEYBOARD;
    inp.ki.wScan = scan;
    inp.ki.dwFlags = KEYEVENTF_SCANCODE | (up ? KEYEVENTF_KEYUP : 0); 
    return SendInput(1, &inp, sizeof(inp)) ? NO_ERROR : GetLastError();
}

DWORD SendVirtualKey(UINT vk, BOOL up)
// посылает нажатие или отпускание виртуальной клавиши с кодом vk
// если up == TRUE то это событие отпускания, иначе нажатия
// возвращает NO_ERROR в случае успеха или код ошибки   
{
    UINT scan = MapVirtualKey(vk, MAPVK_VK_TO_VSC);
    // конвертируем виртуальный код в сканкод
    return scan ? SendScanCode(scan, up) : ERROR_NO_UNICODE_TRANSLATION;
    // если конверсия не удалась, то возвращаем 
    // ERROR_NO_UNICODE_TRANSLATION.
    // Если трансляция есть, то посылаем полученный сканкод
}

void main()
{
    bool dowork = TRUE;//работа цикла(да/нет)
    while(dowork == TRUE)//цикл работает пока dowork = TRUE
    {
        if(GetAsyncKeyState(49))//если нажата цифра 1, то
        {
           SendVirtualKey(VK_TAB, FALSE);//создаём нажатие Tab
           SendVirtualKey(VK_TAB, TRUE);//убираем нажатие Tab
        }
        Sleep(100);//выжидаем 100 мс для уменьшения нагрузки на процессор(главная задержка цикла)
    }
}



Подскажите пожалуйста, где промах?

Автор: Dem_max 12.12.2011, 12:41
Код

int p = 0;
INPUT InpInfo[20];
ZeroMemory(&InpInfo[0], sizeof(InpInfo));
InpInfo[p].type   = INPUT_KEYBOARD;
InpInfo[p].ki.wVk = 0x31;
p++;
InpInfo[p].type       = INPUT_KEYBOARD;
InpInfo[p].ki.wVk     = 0x31;
InpInfo[p].ki.dwFlags = KEYEVENTF_KEYUP;
p++;
SendInput(p, &InpInfo[0], sizeof(INPUT));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)