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

Delphi Windows 10上TabTip.exe(虚拟键盘)的大小和位置?,delphi,winapi,virtual-keyboard,Delphi,Winapi,Virtual Keyboard,需要确定windows 10上TabTip.exe(虚拟键盘)的大小(宽度、高度)和位置(左、上) 任务是移动所有组件所在的面板,以便将输入焦点转移到的输入字段位于虚拟键盘上方 使用Windows 10不在管理员权限下,但编译的项目以管理员身份运行 以下解决方案在Windows 7、Windows 8和Windows 10中均有效,但在Windows 10中它们不起作用: uses ..., Winapi.Windows, Winapi.Dwmapi ... procedure TForm1.S

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

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

使用Windows 10不在管理员权限下,但编译的项目以管理员身份运行

以下解决方案在Windows 7、Windows 8和Windows 10中均有效,但在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;
键盘通话

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;
函数ExpandEnvironmentVar(var值:string):布尔值;
变量
R:整数;
扩展:字符串;
过程StrResetLength(var S:string);
变量
I:整数;
开始
对于I:=0到长度(S)-1 do
如果S[I+1]=#0,那么
开始
设定长度(S,I);
出口
结束;
结束;
开始
设置长度(扩展,1);
R:=ExpandEnvironmentString(PChar(值),PChar(扩展),0);
设定长度(展开,R);
结果:=ExpandEnvironmentStrings(PChar(值),PChar(扩展),R)0;
如果结果是这样的话
开始
StrResetLength(扩展);
值:=扩展;
结束;
结束;
程序TForm1.btnCloseClick(发送方:TObject);
变量
我的手1:THandle;
开始
MyHandle1:=FindWindow('IPTip_主窗口',无);
如果MyHandle10那么
PostMessage(MyHandle1,WM_SYSCOMMAND,SC_CLOSE,0);
结束;
程序TForm1.btnOpenClick(发送方:TObject);
变量
S:字符串;
开始
关闭。单击;
S:='%CommonProgramW6432%\microsoft shared\ink\tabtip.exe';
ExpandEnvironmentVar(S);
ShellExecute(0,PChar(“打开”),PChar(S),nil,nil,SW_SHOWNORMAL);
结束;
没有成功(左=0顶部=0宽度=0高度=0)!有人做过类似的事情吗,或者他知道该怎么做吗?

您应该实施:

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


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

什么是“nothing Successed”(未成功)?函数的结果GetCurrentPropertyValue Get_CurrentBoundingRectangle left=0 top=0 width=0 height=0请在问题中提供详细信息,而不是注释%CommonProgramW6432%不应使用。键盘窗口的类名是内部实现详细信息。不使用%CommonProgramW6432%为什么不使用?TbTip.exe-没有窗口文本(GetWindowText)。我认为这与UWP应用有关
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;