Windows 10 上 TabTip.exe(虚拟键盘)的大小和位置?

Posted

技术标签:

【中文标题】Windows 10 上 TabTip.exe(虚拟键盘)的大小和位置?【英文标题】:Size and position of TabTip.exe (virtual keyboard) on Windows 10? 【发布时间】:2018-05-08 06:04:22 【问题描述】:

需要确定TabTip.exe(虚拟键盘)在windows 10上的大小(宽、高)和位置(左、上)?

任务是移动所有组件所在的面板,使输入焦点转移到的输入字段位于虚拟键盘上方。

使用Windows 10不是在管理员下,而是编译后的项目以管理员身份运行!

以下解决方案在 Windows 7、Windows 8 中有效,在 Windows 10 中无效:

uses ..., Winapi.Windows, Winapi.Dwmapi
...
procedure TForm1.SizeKeyboard;
var KeyBoardRect: TRect;
    KeyboardWindow : HWND;
begin
  KeyboardWindow := FindWindow('IPTip_Main_Window', nil);
  if (KeyboardWindow <> 0) then
    KeyBoardRect := GetRect1(KeyboardWindow);
  ...
end;
...

function TForm1.GetRect1(AKeyboardWindow : HWND): Trect;
var KeyBoardRect: Trect;
begin
    GetWindowRect(AKeyboardWindow, KeyBoardRect);
    Result := KeyBoardRect;
end;


function TForm1.GetRect2(AKeyboardWindow : HWND): Trect;
var KeyBoardRect: Trect;
begin
    DwmGetWindowAttribute(AKeyboardWindow, DWMWA_EXTENDED_FRAME_BOUNDS,     @KeyBoardRect, sizeof(KeyBoardRect));

    Result :=  KeyBoardRect;
end;

但是

Windows 10 触摸键盘是一个 UWP 应用程序。 UWP 应用程序没有本机窗口,无法通过 HWND 引用。您可以使用 UI 自动化获取触摸键盘的边界矩形Get size of Windows 10 touch keyboard window!

https://msdn.microsoft.com/en-us/library/windows/desktop/ee671425(v=vs.85).aspx!

加载的类型库 - UIAutomationClient 接口 IUIAutomation、IUIAutomationElement (UIAutomationClient_TLB)

function TForm1.getRect4(AKeyboardWindow : HWND): Trect;
var AUTOMATION : IUIAutomation;
  Root : IUIAutomationElement;
  rRect:UIAutomationClient_TLB.tagRECT;
begin
    AUTOMATION := CoCUIAutomation.Create;
    AUTOMATION.GetRootElement(Root);
    AUTOMATION.ElementFromHandle(Pointer(AKeyboardWindow), Root);
    Root.Get_CurrentBoundingRectangle(rRect);
    Result :=  TRect(rRect);
end;

function TForm1.getRect5(AKeyboardWindow : HWND): Trect;
var AUTOMATION : IUIAutomation;
  Root : IUIAutomationElement;
  olRect: OleVariant;
  rRect:UIAutomationClient_TLB.tagRECT;
begin
  AUTOMATION := CoCUIAutomation.Create;
  AUTOMATION.GetRootElement(Root);
  AUTOMATION.ElementFromHandle(Pointer(AKeyboardWindow), Root);
  Root.GetCurrentPropertyValue(BoundingRectangle, olRect);
  AUTOMATION.VariantToRect(olRect, rRect);

  Result :=  TRect(rRect);
end;

键盘调用

function ExpandEnvironmentVar(var Value: string): Boolean;
var
  R: Integer;
  Expanded: string;

procedure StrResetLength(var S: string);
  var
    I: Integer;
  begin
    for I := 0 to Length(S) - 1 do
      if S[I + 1] = #0 then
      begin
        SetLength(S, I);
        Exit;
      end;
  end;

begin
  SetLength(Expanded, 1);
  R := ExpandEnvironmentStrings(PChar(Value), PChar(Expanded), 0);
  SetLength(Expanded, R);
  Result := ExpandEnvironmentStrings(PChar(Value), PChar(Expanded), R) <> 0;
  if Result then
  begin
    StrResetLength(Expanded);
    Value := Expanded;
  end;
end;



procedure TForm1.btnCloseClick(Sender: TObject);
var
  MyHandle1: THandle;
begin
  MyHandle1 := FindWindow('IPTip_Main_Window', nil);
  if MyHandle1 <> 0 then
    PostMessage(MyHandle1, WM_SYSCOMMAND, SC_CLOSE, 0);
end;



procedure TForm1.btnOpenClick(Sender: TObject);
var
  S: string;
begin
  btnClose.Click;
  S := '%CommonProgramW6432%\microsoft shared\ink\tabtip.exe';
  ExpandEnvironmentVar(S);
  ShellExecute(0, PChar('open'), PChar(S), nil, nil, SW_SHOWNORMAL);
end;

没有成功(左 = 0 顶部 = 0 宽度 = 0 高度 = 0)!有没有人做过这样的事情,或者他知道该怎么做?

【问题讨论】:

“没有成功”是什么意思? 函数结果 GetCurrentPropertyValue Get_CurrentBoundingRectangle left = 0 top = 0 width = 0 height = 0 请在问题中提供详细信息,而不是 cmets %CommonProgramW6432% 不是您应该使用的东西。键盘窗口的类名是内部实现细节。 不使用 %CommonProgramW6432% 为什么不呢? TbTip.exe - 没有窗口文本 (GetWindowText)。我认为它与 UWP 应用程序有关 【参考方案1】:

你应该实现IFrameworkInputPaneHandler

当输入面板(屏幕键盘或手写面板)显示或隐藏时,应用程序会收到通知。这允许应用程序窗口调整其显示,以便输入窗格不会遮挡任何输入区域(例如文本框)。

有关详细信息和示例代码,请参阅this blog post。

【讨论】:

以上是关于Windows 10 上 TabTip.exe(虚拟键盘)的大小和位置?的主要内容,如果未能解决你的问题,请参考以下文章

在焦点事件 TextBox 上打开触摸键盘 windows 10 |通用应用

在 python 中关闭 OSK (tabtip)

Qt全屏窗口隐藏Win8/10触摸键盘

Windows应用程序因纯虚函数调用而崩溃

开源私有云平台 Nano v0.6.1发布 - 新增云主机地址池管理/Windows server虚

适用于 Android 的 Visual Studio 模拟器不使用 windows 10 pro 运行 vs 2017