Delphi 防止触摸键盘抓住焦点

Delphi 防止触摸键盘抓住焦点,delphi,keyboard,focus,virtual,Delphi,Keyboard,Focus,Virtual,我用Delphi为平板电脑编写了一个小应用程序,所以没有键盘。应用程序中有一个小表单,用户可以在其中输入驱动程序名。我想在表单上放置一个触摸键盘,但由于表单本身很小,无法容纳虚拟键盘。我可以使键盘的大小变小,但那样的话就很难打字了。所以我决定写另一个应用程序,它只由一个键盘组成。当主应用程序中的DBEdit处于焦点时,我希望执行Touchkeyboard应用程序,当DBEdit失去焦点时,关闭Touchkeyboard应用程序。我的一个问题是如何防止Touchkeyboard在发布时抢占焦点。另

我用Delphi为平板电脑编写了一个小应用程序,所以没有键盘。应用程序中有一个小表单,用户可以在其中输入驱动程序名。我想在表单上放置一个触摸键盘,但由于表单本身很小,无法容纳虚拟键盘。我可以使键盘的大小变小,但那样的话就很难打字了。所以我决定写另一个应用程序,它只由一个键盘组成。当主应用程序中的DBEdit处于焦点时,我希望执行Touchkeyboard应用程序,当DBEdit失去焦点时,关闭Touchkeyboard应用程序。我的一个问题是如何防止Touchkeyboard在发布时抢占焦点。另一个问题是如何在主应用程序下显示触摸键盘。提前感谢。

您不需要其他应用程序。只需创建另一个表单,这样您就可以更好地处理焦点和隐藏。我不知道你说的“就在”你的应用程序下面是什么意思,但我想你的意思是窗口的位置应该在应用程序窗口的下面。请参阅此代码段:

有两种形式: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;

这基本上就是显示/隐藏表单所需的全部操作。由于键盘窗体在开始时未显示,因此不会聚焦(除非编辑将TabOrder设置为0,TabStop设置为true,否则应用程序启动时将触发OnNet事件)

它的工作原理

  • 选择编辑时,将调用ShowKeyboard函数,并将编辑作为参数传递
  • 触摸键盘显示,每次单击都会触发TKeyboardForm的OnKeyPress事件(!!!将KeyPreview设置为true)
  • 字符被解码为实际的键盘按钮(Shift、Alt、Control和其他按钮的组合)
  • 这些解码的击键被发送到编辑

注意:SendInput()可以用来代替keybd_事件。

有关虚拟键盘设计的非常有趣的文章和讨论,请参阅

,以了解我成功尝试提供的Delphi键盘可能会引起兴趣。

谢谢bud,真是太好了。我真不敢相信我会如此愚蠢,竟然想用两个不同的应用程序来做这件事。我按照你说的方式做了。当我输入一个dbedit时,表单会出现,但每当我点击键盘表单上的任何键时,键盘表单就会抓住焦点。我不能键入任何东西。我从来没有对这个组件做过任何事情,所以我必须对它进行更多的研究。我更新了代码(或者我将在几秒钟内更新),所以请看它。我更新了我的答案,如果你只是复制程序,它应该可以正常工作。
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;