表单 – 如何将窗口焦点消息用于Delphi屏幕键盘表单

我的应用程序中需要一个内置的屏幕数字小键盘.由于各种原因,我无法使用 TMS Software或其他商业组件产品.我对下面显示的基于按钮的解决方案非常满意,但我还不知道如何解决焦点切换问题,单击按钮激活键盘形式,我失去了我想要角色的聚焦控制.如果我将键盘按钮保持在目标表单内,我的解决方案可行,但我想要一个独立于表单的解决方案.有没有办法禁用按钮激活或知道焦点来自哪里,以便我可以使用像Scree.ActiveControl:= ??把它还掉?

解决方法

我不知道如何使用单击它时无法对焦的框架创建窗口,因此下面的框架没有边框.正如Andreas所说,使用TSpeedButtons.
type
  TKeypadForm = class(TForm)
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
  private
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
  end;

procedure TKeypadForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := WS_POPUP or WS_THICKFRAME;
end;

procedure TKeypadForm.WMMouseActivate(var Message: TWMMouseActivate);
begin
  Message.Result := MA_NOACTIVATE;
end;

procedure TKeypadForm.SpeedButton1Click(Sender: TObject);
begin
  PostMessage(GetFocus,WM_KEYDOWN,VK_NUMPAD1,MakeLong(0,MapVirtualKey(VK_NUMPAD1,0)));
end;

以下是如何显示键盘窗口

procedure TForm18.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_RETURN: ShowWindow(KeypadForm.Handle,SW_SHOWNOACTIVATE);
    VK_ESCAPE: ShowWindow(KeypadForm.Handle,SW_HIDE);
  end;
end;

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些