Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Windows] Можно ли управлять системной виртуальной клавиатурой?


d7d1cd

Вопрос

Привет всем! В Windows 8, 8.1 есть сенсорная клавиатура. Вызвать ее из своей программы можно запустив файл tabtip.exe. Подскажите, а могу ли я управлять этой программой. Например развернуть/свернуть ее, плавно показать из-за края экрана или переключить в режим ввода символов и цифр, "нажав" из своей программы на этой клавиатуре кнопку "&123"?

 

P.S. И, к стати о клавиатуре, вопрос разработчикам FMX: почему на Windows приложения FMX не вызывают сенсорную клавиатуру при выборе контрола, требующего ввода данных?

Изменено пользователем d7d1cd
Ссылка на комментарий

Рекомендуемые сообщения

  • 1
  • Администраторы

Добрый день,
 
Если мне память не изменяет, то она вроде вызывается, только когда у компьютера нету физической виртуальной клавиатуры. И по идеи все функции раскрытия и скрытия так же были реализованы в FMX.Platform.Win.TVirtualKeyboardWin
 
Клавиатура не вызывается, так как виртуальная клавиатура есть в любой версии Windows. И поэтому на обычном десктопном компьютере у вас всегда бы открывалась клавиатура, в не зависимости от вашего желания. 
 
Если вы хотите, чтобы она все таки всегда открывалась, то это можно сделать через глобальную переменную

FMX.Types.VKAutoShowMode := TVKAutoShowMode.Always;

По умолчанию эта переменная имеет значение TVKAutoShowMode.DefinedBySystem

Изменено пользователем Brovin Yaroslav
Добавил информацию о VKAutoShowMode
Ссылка на комментарий
  • 0
  • Администраторы

В FireMonkey пока нету реализации для сенсорной клавиатуры.

 

Но я могу предположить, если изменить эти две строчки, то возможно текущая реализация так же будет работать:

 

FMX.Platform.Win.pas:

constructor TVirtualKeyboardWin.Create;
var
  L: integer;
  S: string;
  HID: HKey;
  DVersion: DWORD;
  Major, Minor: byte;
begin
  S := '';
  inherited Create;
  SetLength(S, MAX_PATH);
  L := GetSystemDirectory(PChar(S), MAX_PATH);
  SetLength(S, L);
  FPath := S;
  FExeName := 'osk.exe';
  FWndClassName := 'OSKMainClass';

Надо изменить название исполняемого файла и класс окна: FExeName и FWndClassName на "tabtip.exe"

 

Ссылка на комментарий
  • 0

Сделал как вы посоветовали:

FExeName := 'tabtip.exe';
  FWndClassName := 'tabtip.exe';

Однако все равно вызывается экранная клавиатура. Наверное файл, который я менял, надо как-то подкрепить к проекту...

Ссылка на комментарий
  • 0
  • Администраторы

FWndClassName - это класс виндового окна приложения сенсорной клавиатуры. Поэтому его нужно было найти и указать в этой переменной, а не tabtip.exe. Найти можно, используя Spy++.

В общем, у меня с такими значениями заработало:

  FPath := 'C:\Program Files\Common Files\Microsoft Shared\ink\';
  FExeName := 'tabtip.exe';
  FWndClassName := 'IPTip_Main_Window';

С учетом того, что tabtip.exe лежит не в системной папке, а по другому пути, нужно еще и FPath прописать.

Ссылка на комментарий
  • 0

Видимо, что-то делаю я не так, потому что вызывается все равно экранная клавиатура. А делаю я так:

 

1. Нашел в папке "C:\Program Files (x86)\Embarcadero\Studio\16.0\source\fmx" файл "FMX.Platform.Win.pas".

2. Открыл этот файл и заменил в нем нужные строки.

3. Запустил среду программирования, создал проект на FMX, добавил поле ввода.

4. В конструкторе формы прописал "VKAutoShowMode = TVKAutoShowMode::Always;"

5. Запустил приложение, нажал на поле ввода и... увидел на экране экранную клавиатуру, а не сенсорную...

 

Что я не доделал?

Ссылка на комментарий
  • 0

Нужно копию измененного "FMX.Platform.Win.pas" файла положить в папку с проектом, либо перекомпиливать тот который лежит в папке с абракадаброй. Мб вы это сделали, но не написали про это :)

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

Нужно копию измененного "FMX.Platform.Win.pas" файла положить в папку с проектом, либо перекомпиливать тот который лежит в папке с абракадаброй. Мб вы это сделали, но не написали про это :)

Не делал я этого. Делаю: кладу копию файла в папку с проектом (сам файл в проект не добавляю), компилирую - вызывается экранная клавиатура. Добавил файл в проект, перекомпилировал - результат тот же.

 

P.S. А еще я на своем планшете увидел, что если вызвать сенсорную клавиатуру принудительно (кнопкой в панели), то у нее есть кнопка закрыть и свернуть, а у полноэкранных приложений из магазина Windows (IE, например) их нет. Вот как бы еще именно так вывести сенсорную клавиатуру в своем приложении...  :)

Изменено пользователем d7d1cd
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...