Печать слова 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;
проверил коды клавиш, событием 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
.....
т.е. 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);
а события от 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;
по признаку которого, метод 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;
Если требуется такой вот перевод, то или описывайте все, или делайте метод, который можно переопределить!! тогда вызвав метод родителя, и получив XK_VoidSymbol, можно было бы просто проверить на нужные в проекте клавиши
и выдать их методу DoDown
А тут просто функция перевода, да еще и в implementation! т.е. без вариантов к ней добраться из вне!
треш!!
