Как заставить все мои ключи отправлять коды клавиши

Попробуйте это:

#include <stdio.h>
#include <stdlib.h>

#define SIZE (1024*1024)

int main (int argc, char *argv[])
{
  FILE *from = fopen(argv[1], "rb");
  FILE *to = fopen(argv[2], "wb");
  int nbits = atoi(argv[3]);
  int offs_bytes = nbits/8;
  int shift_bits = nbits%8;
  unsigned char *buf = malloc(SIZE);
  size_t res, pos, i;

  for (pos=0; pos<offs_bytes; pos++)
    buf[pos] = 0;

  buf[pos++] = 0;

  while ((res = fread(buf+pos, 1, SIZE-pos, from))) {
    for (i=0; i < res; i++) {
      buf[pos-1] |= (buf[pos] >> shift_bits) & 0xFF;
      buf[pos] = buf[pos] << (8 - shift_bits);
      pos++;
    }
    fwrite(buf, 1, pos-1, to);
    buf[0] = buf[pos-1];
    pos = 1;
  }
  fwrite(buf, 1, 1, to);
  fclose(from); fclose(to);
  return 0;
}

(Простой алгоритм, никакая проверка ошибок, едва протестированная, и т.д.... [обычные протесты]).

14
17.05.2014, 02:54
1 ответ
[1130298] не используйте [1130750] showkey[1130751] или [1130752] xev[1130753] -- вместо этого используйте [1130754] udev[1130755] и [1130756] evtest[1130757]. [12193]Посмотрите на вывод [1130758]evtest[12194] и на второе устройство (та же клавиатура, но с мультимедийными клавишами):[12195]Все события, которые имеют коды > 255 не будут работать, и вы должны вернуть клавиши на прежнее место. Но сначала необходимо получить несколько кодов сканирования:[12196]и нажать клавиши, которые не работают. Если вы не получите здесь никаких кодов сканирования, вероятно, клавиша мертва, и вы ничего не сможете с этим поделать.[12197]Теперь вы должны проверить, какие коды клавиш свободны - вы можете сделать это, сняв на основе файла [1130760]/usr/include/linux/input.h[1130761], скажем:[12198]или вы можете нажать на каждую клавишу на клавиатуре и сопоставить их вручную. В любом случае, если вы знаете, какие клавиши свободны, вы можете создать файл с подобным содержимым:[12200]Вы можете сохранить его в файле [1130762]/lib/udev/keymaps/logitech-media-keykeyboardd-elite[1130763] -- это для моей клавиатуры. [12201]А теперь создайте правило для [1130764]udev[1130765], оно должно выглядеть так:[12202]ENV{ID_VENDOR_ID}[1130767], [1130768]ENV{ID_MODEL_ID}[1130769] и другие параметры, которые можно прочитать из:[12203]или:[12204]Сохраните это правило в разделе [1130770]/etc/udev/rules. d/95-клавиатура-медиа-клавиатура-elite.rules[1130771] и перетащите клавиатуру. Для меня это хорошо работает, и для вас тоже.[1130323]
10
27.01.2020, 19:51

Теги

Похожие вопросы