Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как нажать клавишу клавиатуры?

465
29 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Пытаюсь нажать вот так:

keybd_event(Key, 0, 0, 0);
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);

Но не канает. Здесь как я себе вижу просто ставится сообщение в очередь, и принимает его объект активный (в фокусе) в данный момент.
Программа которая должна принять нажатие клавиши, видимо после долгих экспериментов, использует DirectInput .
Вот тут уже есть непонимание. Везде в интернете тема называется "Эмуляция нажатия клавиш на клавиатуре" и попадаются примеры преимущественно с использованием функции указанной выше. Но по факту получается что это не эмуляция, раз в некоторых программах не работает.
Есть подозрения что из за операционной системы(и её надстроек) это может превратиться в тяжёлую задачу.
Вопроса по сути два:
Как программно нажать клавишу в DirectInput? (В принципе этого будет достаточно, второй вопрос просто интересно)
Как реализовать реальную программную эмуляцию нажатия кнопки?
(Когда аппаратная клавиатура отправляет код клавиши, все же понимают кому и какой отправлен код клавиши не зависимо директ они там или не директ). Клавиатура USB, но тем не менее прекрасно работает и в БИОСе и в ДОСе. Отсуда делается вывод что клава не просто какоето там абстрактное устройство организованное драйверами виндовс, а устройство которое изначально потребляет какие то ресурсы(I\o, прерывания, может ещё чтото, а может всё вместе). Можно ли записать код клавиши(не нажимая клавиш), или процессор принципиально на это не способен(ну например с контроллера клавиатуры может только читать)? А в моём случае вообще не пойму что есть контроллер клавиатуры(устройство связывающее порт клавиатуры с одной из шин процессора), USB хост превращается в контроллер клавиатуры.
277
29 апреля 2012 года
arrjj
1.7K / / 26.01.2011
Хуки на DirectInput*Create CreateDevice GetDeviceState.

Или использовать готовые кликеры.
465
29 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: arrjj
Хуки на DirectInput*Create CreateDevice GetDeviceState.

Или использовать готовые кликеры.



DirectInput умноженное на Create?(шутка)

Скачал я один клакер, там какой то свой язык, скрипт какой то нужно писать. В общем убийство мозга.
Не подскажите простенькую программку которая будет требовать ввода горячей клавиши затем запоминать действия юзера на клавиатуре, ну и например выходить из этого состояния по нажатию горячей клавиши.

С директом не работал, но попробую разобраться.

Второй вопрос, наверное нужно в майкрософт поработать годика 2. :-)

24K
12 мая 2012 года
cn_venom
11 / / 23.01.2007
Можно попробовать низкоуровневую эмуляцию клавиатуры, мыши и других железок Ввода MSDN:SendInput.

Использовать, например, так:

Код:
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));
Где 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 и программа запущена с обычными привилегиями, эмулированные действия не будут передаваться в системный контекст (Свойства компьютера, список служб и другие программы, работающие с повышенными привилегиями)
465
13 мая 2012 года
QWERYTY
595 / / 25.03.2012
Спасибо. К сожалению на данный момент нет времени попробовать.
А вообще интересно, будет время вернусь к этой теме.

Хотел комбо закодить для шивы в мортал комбате, в лом постоянно набивать на клавиатуре(да и не доделывается бывает в самый накалённый момент) :)
465
16 мая 2012 года
QWERYTY
595 / / 25.03.2012
SendInput тоже не катит. написал в таймере нажимать клавишу, в блокноте печатает, а в игре не работает, в опциях настроил действие по нажатию клавиши но ничего не происходит.

Остаётся два пути, DirectInput или попробовать по книге Кулакова о программировании на аппаратном уровне.
Но он там использует прерывания биос, и боюсь на дурачка в ХР не прокатит.
А директ муть ещё та(с точки зрения программирования, а не функционала), больно там движухи дофига ради нажатия клавиши.
Какието инициализации, подключения к интерфейсам, а я как раз этой темы не понял.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог