Печать слова 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! т.е. без вариантов к ней добраться из вне!
треш!!