Запись в драйвер контроллера ввода-вывода (входной) (порт клавиатуры PS / 2) Левая и правая клавиши клавиатуры?

я использую inpout32/64 Аппаратный контроллер портов ввода / вывода, использующий этот системный драйвер InpOut32 и InpOutx64

Я пытаюсь использовать это, чтобы обойти проблемы, которые у меня есть с играми DirectInput.
(Не могу использовать SendInputпотому что он будет отклонять вводы без очень длительных задержек сна, и я не могу ждать так долго, это должны быть очень быстрые вводы с клавиатуры).

Я сейчас получил inpout32 работая в основном для всех клавиш клавиатуры, я не могу понять, как получить доступ к клавишам со стрелками ВЛЕВО / ВПРАВО.

Просматривая эту страницу о клавиатуре PS / 2 PS / 2 клавиатурные команды

Разобрался это то что мне нужно

0xE0, 0x4B   cursor left pressed
0xE0, 0x4D   cursor right pressed

Как мне отправить оба из них, я не понимаю, что это такое 0xE0 Я предполагаю, что это код сканирования и 0x4B а также 0x4D позиции в этом коде сканирования, но он не работает в моем примере, он продолжает отправлять \ для левой клавиши.

Вот код, который я использую

BOOL isDriverOn = false;
#define LEFT 0x4B
#define RIGHT 0x4D

void setup() {
isDriverOn = IsInpOutDriverOpen();
}

//void  _stdcall Out32(short PortAddress, short data);
//short _stdcall Inp32(short PortAddress);
void DD_PS2command(short comm, short value) {
if(!isDriverOn) {
printf("PS/2 Keyboard port driver is not opened\n");
return;
}
//keyboard wait.
int kb_wait_cycle_counter = 1000;
while((Inp32(0x64) & 0x02) && kb_wait_cycle_counter--) //wait to get communication.
Sleep(1);
if(kb_wait_cycle_counter) { //if it didn't timeout.
Out32(0x64, comm); //send command
kb_wait_cycle_counter = 1000;
while((Inp32(0x64) & 0x02) && kb_wait_cycle_counter--) //wait to get communication.
Sleep(1);
if(!kb_wait_cycle_counter) {
printf("failed to get communication in cycle counter timeout), who knows what will happen now\n");
//return false;
}
Out32(0x60, value); //send data as short
Sleep(1);
//return true;
} else {
printf("failed to get communication in counter timeout, busy)\n");
//return false;
}
}

void DD_Button(short btn, bool release = false, int delay = 0)
{
//0xE0, 0x4B   {Left}
//0xE0, 0x4D   {Rght}
//return scode | (release?0x80:0x00);
short scan_code = 0;
if(btn == LEFT)
scan_code = LEFT + 0xE0;
else if(btn == RIGHT)
scan_code = RIGHT + 0xE0;
else
scan_code = 0x0;

scan_code |= (release ? 0x80 : 0x00);

if(delay)
Sleep(delay);
DD_PS2command(0xD2, scan_code);
}

РЕДАКТИРОВАТЬ: Проблема решена, эта функция работает ниже, просто нужно заставить команду DD_PS2 возвращать true / false (чтобы указать, прошла она или нет).
Новая проблема: он мгновенно отпускает ключ, но не удерживает ключ.

Вот все ключи http://www.computer-engineering.org/ps2keyboard/scancodes1.html

void DD_Button(short btn, bool release = false, int delay = 0)
{
//;0xE0, 0x4B      {Left}
//;0xE0, 0x4D      {Rght}
//  return scode | (release? 0x80: 0x00)
short scan_code = 0;
bool good = false;
switch(btn) {
case LEFT:
case RIGHT:
scan_code = btn;
//send extended byte first (grey code)
good = DD_PS2command(0xD2, 0xE0);
break;
}
printf("good = %d\n", good);
scan_code |= (release ? 0x80 : 0x00);

if(delay)
Sleep(delay);
//0xD2 - Write keyboard output buffer
good = DD_PS2command(0xD2, scan_code);
printf("2 good = %d\n", good);
}

0

Решение

0xE0 это код выхода для расширенных ключей — то есть слева, вы отправляете 0xE0, а затем отправить 0x4B сразу после этого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]