Размер и положение TabTip.exe (виртуальная клавиатура) в Windows 10? - PullRequest
0 голосов
/ 08 мая 2018

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

1 Ответ

0 голосов
/ 08 мая 2018

Вы должны реализовать IFrameworkInputPaneHandler:

Позволяет приложению получать уведомления, когда панель ввода (экранная клавиатура или панель рукописного ввода) отображается или скрывается. Это позволяет окну приложения настроить отображение таким образом, чтобы области ввода (например, текстовое поле) не закрывались панелью ввода.

См. это сообщение в блоге для получения подробной информации и примера кода.

...