Как нажать клавишу клавиатуры?
keybd_event(Key, 0, 0, 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
Но не канает. Здесь как я себе вижу просто ставится сообщение в очередь, и принимает его объект активный (в фокусе) в данный момент.
Программа которая должна принять нажатие клавиши, видимо после долгих экспериментов, использует DirectInput .
Вот тут уже есть непонимание. Везде в интернете тема называется "Эмуляция нажатия клавиш на клавиатуре" и попадаются примеры преимущественно с использованием функции указанной выше. Но по факту получается что это не эмуляция, раз в некоторых программах не работает.
Есть подозрения что из за операционной системы(и её надстроек) это может превратиться в тяжёлую задачу.
Вопроса по сути два:
Как программно нажать клавишу в DirectInput? (В принципе этого будет достаточно, второй вопрос просто интересно)
Как реализовать реальную программную эмуляцию нажатия кнопки?
(Когда аппаратная клавиатура отправляет код клавиши, все же понимают кому и какой отправлен код клавиши не зависимо директ они там или не директ). Клавиатура USB, но тем не менее прекрасно работает и в БИОСе и в ДОСе. Отсуда делается вывод что клава не просто какоето там абстрактное устройство организованное драйверами виндовс, а устройство которое изначально потребляет какие то ресурсы(I\o, прерывания, может ещё чтото, а может всё вместе). Можно ли записать код клавиши(не нажимая клавиш), или процессор принципиально на это не способен(ну например с контроллера клавиатуры может только читать)? А в моём случае вообще не пойму что есть контроллер клавиатуры(устройство связывающее порт клавиатуры с одной из шин процессора), USB хост превращается в контроллер клавиатуры.
Или использовать готовые кликеры.
Цитата: arrjj
Хуки на DirectInput*Create CreateDevice GetDeviceState.
Или использовать готовые кликеры.
Или использовать готовые кликеры.
DirectInput умноженное на Create?(шутка)
Скачал я один клакер, там какой то свой язык, скрипт какой то нужно писать. В общем убийство мозга.
Не подскажите простенькую программку которая будет требовать ввода горячей клавиши затем запоминать действия юзера на клавиатуре, ну и например выходить из этого состояния по нажатию горячей клавиши.
С директом не работал, но попробую разобраться.
Второй вопрос, наверное нужно в майкрософт поработать годика 2. :-)
MSDN:SendInput.
Использовать, например, так:
Где vkCode - Virtual Key Code, такой как, например, VK_SPACE, VK_RETURN, VK_F1..VK_F12.
Из Windows SDK <winuser.h>:
VK_0 .. VK_9 = 0x30 .. 0x39
VK_A .. VK_Z = 0x41 .. 0x5A
Еще надо учитывать, что эмуляция некоторых клавиш, например, как ВВЕРХ/ВНИЗ/ВЛЕВО/ВПРАВО (VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT) требует флага inp.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY. В Windows Vista и выше, если работает UAC и программа запущена с обычными привилегиями, эмулированные действия не будут передаваться в системный контекст (Свойства компьютера, список служб и другие программы, работающие с повышенными привилегиями)
Можно попробовать низкоуровневую эмуляцию клавиатуры, мыши и других железок Ввода
Использовать, например, так:
Код:
INPUT inp;
memset(&inp, 0, sizeof(INPUT));
inp.type = INPUT_KEYBOARD;
inp.ki.wVk = vkCode;
inp.ki.wScan = MapVirtualKey(vkCode, MAPVK_VK_TO_VSC);
inp.ki.dwFlags = 0;
SendInput(1, &inp, sizeof(INPUT));
inp.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &inp, sizeof(INPUT));
memset(&inp, 0, sizeof(INPUT));
inp.type = INPUT_KEYBOARD;
inp.ki.wVk = vkCode;
inp.ki.wScan = MapVirtualKey(vkCode, MAPVK_VK_TO_VSC);
inp.ki.dwFlags = 0;
SendInput(1, &inp, sizeof(INPUT));
inp.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &inp, sizeof(INPUT));
Из Windows SDK <winuser.h>:
VK_0 .. VK_9 = 0x30 .. 0x39
VK_A .. VK_Z = 0x41 .. 0x5A
Еще надо учитывать, что эмуляция некоторых клавиш, например, как ВВЕРХ/ВНИЗ/ВЛЕВО/ВПРАВО (VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT) требует флага inp.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY. В Windows Vista и выше, если работает UAC и программа запущена с обычными привилегиями, эмулированные действия не будут передаваться в системный контекст (Свойства компьютера, список служб и другие программы, работающие с повышенными привилегиями)
А вообще интересно, будет время вернусь к этой теме.
Хотел комбо закодить для шивы в мортал комбате, в лом постоянно набивать на клавиатуре(да и не доделывается бывает в самый накалённый момент) :)
Остаётся два пути, DirectInput или попробовать по книге Кулакова о программировании на аппаратном уровне.
Но он там использует прерывания биос, и боюсь на дурачка в ХР не прокатит.
А директ муть ещё та(с точки зрения программирования, а не функционала), больно там движухи дофига ради нажатия клавиши.
Какието инициализации, подключения к интерфейсам, а я как раз этой темы не понял.