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

Я использую inpout32/64 аппаратный контроллер порта ввода-вывода с этим системным драйвером InpOut32 и InpOutx64.

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

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

На этой веб-странице о командах клавиатуры 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);
}

person SSpoke    schedule 03.01.2014    source источник


Ответы (1)


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

person Notlikethat    schedule 03.01.2014
comment
Да, это решило мою проблему, есть идеи, почему он выпускает ключ сразу после отправки? или.. мне нужно что-то отправить, чтобы он не вышел? - person SSpoke; 04.01.2014