Не позволяйте TouchKeyboard захватывать фокус - PullRequest
2 голосов
/ 23 мая 2011

Я написал небольшое приложение на Delphi для планшетного ПК. Так что нет клавиатуры. И в приложении есть небольшая форма, где пользователь может вводить имена драйверов. Я хотел поместить TouchKeyboard на форму, но так как сама форма маленькая, невозможно разместить виртуальную клавиатуру. Я могу сделать размер клавиатуры небольшим, но в этом случае его будет очень сложно печатать. Поэтому я решил написать другое приложение, состоящее только из клавиатуры. Когда DBEdit в основном приложении сфокусирован, я хочу запустить приложение Touchkeyboard, а когда DBEdit теряет фокус, закройте приложение Touchkeyboard. Один из моих вопросов - как не дать сенсорной клавиатуре сфокусироваться на запуске. И другой - как я могу отобразить сенсорную клавиатуру прямо под основным приложением. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 23 мая 2011

для очень интересных статей и обсуждения дизайна виртуальной клавиатуры, см. http://www.virtual -keyboard-design.com

2 голосов
/ 23 мая 2011

Вам не нужно другое приложение.Просто создайте другую форму, чтобы вы могли работать с фокусами и лучше скрываться.Я не уверен, что вы подразумеваете под «просто под» вашим приложением, но я полагаю, вы подразумеваете, что положение окна должно быть ниже окна приложения.Посмотрите этот фрагмент:

Существует 2 формы: MainForm и KeyboardForm.

unit MainFormUnit;
uses (...),KeyboardForm;

(...)
var KeybdShown: boolean = false;


procedure TMainForm.InputEditEnter(Sender: TObject); // OnEnter event
begin
  if not KeybdShown then begin
    KeybdShown:=true;
    KeyboardForm.Top:=Top+ClientHeight;
    KeyboardForm.Left:=Left;

    KeyboardForm.ShowKeyboard(InputEdit); //Shows the keyboard form and sends our edit as parameter
  end;
end;

procedure TMainForm.InputEditExit(Sender: TObject); // OnExit event
begin
  KeyboardForm.Hide;
  KeybdShown:=false;
end;

...

unit KeyboardFormUnit;
var FocusedControl: TObject;
implementation
uses MainFormUnit;

procedure TKeyboardForm.FormKeyPress(Sender: TObject; var Key: Char);
var VKRes: SmallInt;
    VK: byte;
    State: byte;
begin
  VKRes:=VkKeyScanEx(Key, GetKeyboardLayout(0)); // Gets Virtual key-code for the Key
  vk:=vkres; // The virtualkey is the lower-byte
  State:=VKRes shr 8; // The state is the upper-byte

  (FocusedControl as TEdit).SetFocus; // Sets focus to our edit
  if (State and 1)=1 then keybd_event(VK_SHIFT,0,0,0); //   These three procedures
  if (State and 2)=2 then keybd_event(VK_CONTROL,0,0,0); // send special keys(Ctrl,alt,shift)
  if (State and 4)=4 then keybd_event(VK_MENU,0,0,0); //    if pressed

  keybd_event(VK,0,0,0); // sending of the actual keyboard button
  keybd_event(VK,0,2,0);

  if (State and 1)=1 then keybd_event(VK_SHIFT,0,2,0);
  if (State and 2)=2 then keybd_event(VK_CONTROL,0,2,0);
  if (State and 4)=4 then keybd_event(VK_MENU,0,2,0);
  Key:=#0;
end;

procedure TKeyboardForm.ShowKeybd(Focused: TObject);
begin
  FocusedControl:=Focused;
  Show;
end;

И это в основном все, что вам нужно для отображения / скрытия формы.Поскольку KeyboardForm не отображается при запуске, он не фокусируется (если только для Edit не установлено значение TabOrder, равное 0, при значении TabStop true - тогда событие OnEnter вызывается при запуске приложения).

Как это работает

  • Когда вы выбираете Edit, вызывается функция ShowKeyboard, передавая редактирование в качестве параметра
  • Сенсорная клавиатура отображается и при каждом щелчкеон запускает событие OnKeyPress для TKeyboardForm (!!! устанавливает KeyPreview в true)
  • Символ декодируется на фактические кнопки клавиатуры (комбинация клавиш Shift, Alt, Control и других)
  • Эти декодируютсянажатия клавиш отправляются на редактирование

Примечание: SendInput () можно использовать вместо keybd_event.

1 голос
/ 23 мая 2011

Ответы на мою успешную попытку предоставить клавиатуру Delphi могут представлять интерес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...