MouseAndKeyInput не работает нажатие на клавиши VK_OEM_4

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

MouseAndKeyInput не работает нажатие на клавиши VK_OEM_4

Сообщение ssnakess » 01.08.2023 13:45:42

Взял пример из пакета MouseAndKeyInput.
Печать слова hello - работает. но добавил нажатие двух клавиш - [ и ]
и ничего не происходит

Код: Выделить всё
procedure TForm1.SendKeys(Data: PtrInt);
begin
  Edit1.SetFocus;
  Application.ProcessMessages;
  KeyInput.Press(VK_OEM_4);
  KeyInput.Press(VK_H);
  KeyInput.Press(VK_E);
  KeyInput.Press(VK_L);
  KeyInput.Press(VK_L);
  KeyInput.Press(VK_O);
  KeyInput.Press(VK_OEM_6);
end; 

т.е. hello - печатается, а вот "[" и "]" - ни как, даже пробела вместо них нет
проверил коды клавиш, событием onKeyUp - код клавиши "[" и значения константы VK_OEM_4 совпадают

проверил ручным вводом, контрол Edit1 - символы "[" и "]" - печатаются
т.е. получается что KeyInput.Press(VK_OEM_4) - не отправляет нажатие клавиши "[" , но почему??
Что я делаю не так??

Добавлено спустя 21 минуту 10 секунд:
нашел еще такую вот приписочку вмодуле LCLType
Код: Выделить всё
  // VK_OEM keys are utilized only when Application.ExtendedKeysSupport is false
.....
  VK_OEM_4               = $DB; // Used for miscellaneous characters; it can vary by keyboard.
                                // For the US standard keyboard, the '[{' key
.....
  VK_OEM_6               = $DD; // Used for miscellaneous characters; it can vary by keyboard.
                                // For the US standard keyboard, the ']}' key                 
.....


очень странный перевод получается "VK_OEM работают только когда Application.ExtendedKeysSupport:=false"
т.е. ExtendedKeysSupport - Поддержка расширенной клавиатуры должна стоять в "Нет"

Но не суть важно. т.к. ставь это свойство хоть в True, хоть в False - всеравно эти клавиши не отрабатыватют.
проверил на TMemo
добавил событие OnKeyUP и код клавиши пишу в этоже Memo,
и из всего вот этого
Код: Выделить всё
  KeyInput.Press(VK_OEM_4);
  KeyInput.Press(VK_H);
  KeyInput.Press(VK_E);
  KeyInput.Press(VK_L);
  KeyInput.Press(VK_L);
  KeyInput.Press(VK_O);
  KeyInput.Press(VK_OEM_6);

в Memo пришли события только для VK_H, VK_E, VK_L, VK_O
а события от VK_OEM_4 и VK_OEM_6 - не было!

Добавлено спустя 28 минут 17 секунд:
Значится вот как это должно быть
InputKey - вызывает метод KeyDown из объекта TXKeyInput
модуля XKeyInput
а вот его метод
Код: Выделить всё
procedure TXKeyInput.DoDown(Key: Word);
var
  Display: PDisplay;
  KeySym: TKeySym;
begin
  KeySym := VirtualKeyToXKeySym(Key);
  if KeySym = XK_VoidSymbol then Exit;
 
  Display := XOpenDisplay(nil);
  XTestFakeKeyEvent(Display, XKeysymToKeycode(Display, KeySym), True, 0);
  XFlush(Display);
  XCloseDisplay(Display);
end;


Вся засада в работе этой строки
KeySym := VirtualKeyToXKeySym(Key);

Оказывается VirtualKeyToXKeySym(Key) - переводит VK в еще какойто код
Код: Выделить всё
function VirtualKeyToXKeySym(Key: Word): TKeySym;
begin
  case Key of
    VK_BACK: Result := XK_BackSpace;
   ....
    VK_A: Result := XK_a;
    VK_B: Result := XK_b;
   .....
  else
    Result := XK_VoidSymbol;
  end;
end;

в теле этой функции описана лишь маленькая часть перевода кодов, а на все остальное ставит XK_VoidSymbol
по признаку которого, метод DoDown - просто делает выход!!!

А кодов XK_.... в модуле KeySym - описано вагон и маленькая тележка

в итоге лечится это путем добавления перевода VK_OEM_4 в XK_bracketleft
Код: Выделить всё
function VirtualKeyToXKeySym(Key: Word): TKeySym;
begin
  case Key of
    VK_BACK: Result := XK_BackSpace;
   ....
    VK_A: Result := XK_a;
    VK_B: Result := XK_b;
   .....
    VK_OEM_4: result:=XK_bracketleft;
  else
    Result := XK_VoidSymbol;
  end;
end;


Что является полным бредом!! Ведь эта функция даже не метод класса TKeyInput !!!
Если требуется такой вот перевод, то или описывайте все, или делайте метод, который можно переопределить!! тогда вызвав метод родителя, и получив XK_VoidSymbol, можно было бы просто проверить на нужные в проекте клавиши
и выдать их методу DoDown
А тут просто функция перевода, да еще и в implementation! т.е. без вариантов к ней добраться из вне!
треш!!
ssnakess
новенький
 
Сообщения: 36
Зарегистрирован: 24.09.2011 23:08:55

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

Рейтинг@Mail.ru
cron