Размер и положение TabTip.exe (виртуальная клавиатура) в Windows 10?

Нужно определить размер (ширина, высота) и положение (слева, сверху) 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. Вы можете использовать автоматизацию пользовательского интерфейса, чтобы получить ограничивающий прямоугольник сенсорной клавиатуры Получить размер окна сенсорной клавиатуры Windows 10!

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)! Кто-нибудь делал что-то подобное, или он знает, что делать?


person Den    schedule 08.05.2018    source источник
comment
Что значит ничего не удалось?   -  person David Heffernan    schedule 08.05.2018
comment
результат функций GetCurrentPropertyValue Get_CurrentBoundingRectangle слева = 0 сверху = 0 ширина = 0 высота = 0   -  person Den    schedule 08.05.2018
comment
Пожалуйста, предоставьте подробности в вопросе, а не в комментариях   -  person David Heffernan    schedule 08.05.2018
comment
%CommonProgramW6432% вам не следует использовать. Имя класса окна клавиатуры является внутренней деталью реализации.   -  person Anders    schedule 08.05.2018
comment
Не используйте %CommonProgramW6432%, почему бы и нет? TbTip.exe - нет текста окна (GetWindowText). Я думаю, что это связано с приложениями UWP.   -  person Den    schedule 08.05.2018
comment
CommonProgramW6432 не существует в 32-битной системе.   -  person Anders    schedule 08.05.2018
comment
Я частично решил эту проблему в этом модуле: /а>. Согласно моему комментарию, я предполагаю, что перепутал декларацию или что-то в этом роде. Не стесняйтесь играть с ним   -  person Dave Nottage    schedule 09.05.2018


Ответы (1)