• 0
Dozent

Вызов клавиатуры в Windows 8-8.1

Вопросы

День добрый! Как вызвать клавиатуру при попадании фокуса в эдит, приложение под 8.1? Я кинул на форму эдит указал тип клавиатуры, запускаю проект, тыкаю на эдит но клавиатура не появляется....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 ответов на этот вопрос

  • 0

по этой ссылке не подходит, вызывается не та клавиатура...

 

http://habrahabr.ru/...el/blog/163333/

по этой ссылке чото не могу перевести сишный код на делфи

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вообщем реализация такая

//добавляем в uses
ShellApi, Winapi.Windows, Winapi.messages;

// вызов сенсорной клавиатуры
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.Edit2Click(Sender: TObject);
var
  S: string;
begin
  S := '%CommonProgramW6432%\microsoft shared\ink\tabtip.exe';
  if ExpandEnvironmentVar(S) then
    Caption := S
  else
    Caption := S; { :-) }
  ShellExecute(0, PChar('open'), PChar(Caption), nil, nil, SW_SHOWNORMAL);
end;

//закрытие
procedure TForm1.Button1Click(Sender: TObject);
var
  MyHandle1: THandle;
begin
  MyHandle1 := FindWindow('IPTip_Main_Window', nil);

  if MyHandle1 <> 0 then
  begin
    PostMessage(MyHandle1, WM_SYSCOMMAND, SC_CLOSE, 0);
    Label2.Text := IntToStr(MyHandle1);
  end;

end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

по этой ссылке не подходит, вызывается не та клавиатура...

Как понять "не та клавиатура"? Она в винде одна. В принципе "другая" вызваться не может. Ваш код - это просто перевод информации ссылки на хабре с С++ на делфи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

не та значит нета:) Есть экранная клавиатура, а есть сенсорная и ехе файлы разные для этих приложений...

 

 Ваш код - это просто перевод информации ссылки на хабре с С++ на делфи.

 

а я и неговорю что придумал это сам... за ссылку спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

не та значит нета :) Есть экранная клавиатура, а есть сенсорная и ехе файлы разные для этих приложений... 

Простите за назойливость: можно Вас попросить привести скриншоты сенсорной и экранной клавиатур, а так же назовите имена exe файлов для этих клавиатур?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Предлагаю такой эксперимент: Форма, на ней 2 TEdit, у одного стоит PasswordChar. Компилим, запускаем на планшете с виндой 8+ без подключённой клавиатуры.

Результат будет таков: безо всякой дополнительной обработки при получении фокуса того поля ввода, где установлен PasswordChar, сенсорная клава будет появляться. Фокус на другом поле ввода - клава будет убираться. Отсюда вывод - чтобы клава появлялась автоматом, поле ввода должно нести в себе какой-то стиль окна или расширенный стиль окна или стиль класса, в общем, что-то из этой области. Этот стиль окна используется при получении окном сообщения EM_SETPASSWORDCHAR при условии наличия этого самого Char. Прокурил насколько мог VCL, не смог найти место обработки этого сообщения, оно где-то глубже, чем сама VCL.

Пока что у меня, как и у многих, всё сделано на вызове tabtip, но я уверен, совместными усилиями можно найти правильное филигранное решение по выскакиванию сенсорной клавы без извращений с дёрганием другого экзешника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Lem0nti сказал:

Прокурил насколько мог VCL, не смог найти место обработки этого сообщения, оно где-то глубже, чем сама VCL.

Пардон... а при чем здесь VCL? Или вам под него надо клавиатуру показывать?

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
23 часа назад, kami сказал:

Пардон... а при чем здесь VCL? Или вам под него надо клавиатуру показывать?

Предлагаемый мною эксперимент реализован на VCL. Его цель - продемонстрировать аргументы о том, что в винде уже реализована автоматизация по всплыванию тач-клавы. Задача - научиться использовать эту автоматизацию, потому что вызовы клавы через шелэкзекьют это плохой вариант решения проблемы. 

И таки да, в моём реальном случае клава нужна в приложении, реализованном на VCL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 12.12.2016 в 16:08, Lem0nti сказал:

Предлагаю такой эксперимент: Форма, на ней 2 TEdit, у одного стоит PasswordChar. Компилим, запускаем на планшете с виндой 8+ без подключённой клавиатуры.

Результат будет таков: безо всякой дополнительной обработки при получении фокуса того поля ввода, где установлен PasswordChar, сенсорная клава будет появляться. Фокус на другом поле ввода - клава будет убираться. Отсюда вывод - чтобы клава появлялась автоматом, поле ввода должно нести в себе какой-то стиль окна или расширенный стиль окна или стиль класса, в общем, что-то из этой области. Этот стиль окна используется при получении окном сообщения EM_SETPASSWORDCHAR при условии наличия этого самого Char. Прокурил насколько мог VCL, не смог найти место обработки этого сообщения, оно где-то глубже, чем сама VCL.

Пока что у меня, как и у многих, всё сделано на вызове tabtip, но я уверен, совместными усилиями можно найти правильное филигранное решение по выскакиванию сенсорной клавы без извращений с дёрганием другого экзешника.

Решил повторить Ваш эксперимент (тоже в VCL). Кинул на форму 2 эдита. У одно из них задал PasswordChar, у другого не задавал. Сделал релиз компиляцию и запустил файл на планшете с Windows 10. Независимо где установлен фокус ввода, сенсорная клава не появляется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 12.12.2016 в 16:08, Lem0nti сказал:

Предлагаю такой эксперимент

Проще выложить исходники и *.exe файлы. Тогда сравнение

 

1 час назад, d7d1cd сказал:

Решил повторить Ваш эксперимент

будет более объективным. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В аттаче конечный вариант моих экспериментов на эту тему. Я просто скопировал все разные поля ввода из приложения сюда. Прилагаемый скриншот чтобы было понятно какие из полей ввода - пароли.

Последний запуск был на винде 10, автовсплывание клавиатуры включено в настройках. В итоге - на паролях всплывает, в остальных - нет.

Важный момент - если подключена железная клава или работа идёт по удалённому доступу и вместо тапов клики мыши, то всплывание в любом случае не происходит.

AutoKeyTest.rar

scr.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

На 10 у меня не всплывает, уточните

10 часов назад, Lem0nti сказал:

автовсплывание клавиатуры включено в настройках

это где? Клаву отключил.

Изменено пользователем GASCHE

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Параметры - Устройства - Ввод - Автоматическое отображение сенсорной клавиатуры, и т.д.

http://windowsprofi.ru/wp-content/uploads/2016/06/Фото-9-11.jpg

Изменено пользователем Lem0nti

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

У меня в Windows 10 (обновлена до последнего обновления) нет такого пункта в настройках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Макс Войтенко
      var Keyboard: IFMXVirtualKeyboardService; begin if TPlatformServices.Current.SupportsPlatformService( IFMXVirtualKeyboardService, IInterface( Keyboard ) ) then if TVirtualKeyboardState.Visible in Keyboard.GetVirtualKeyBoardState then ShowMessage( 'клавиатура открыта' ) else ShowMessage( 'клавиатура скрыта' ); end; ТАК Я на шел для делфи. Но мне нужно для C++
    • От Barbanel
      Здравствуйте уважаемые,
      есть форма с множеством TEdit, при этом они не помещаются на один экран и помещена на TScrollBox.
      При скороллинге если скроллить нажимая на подложку (т.е. сам TScrollBox) все работает идеально, если же нажимать на сам TEdit и таким образом скроллить, то выезжает клавиатура, что вобщемто неудобно.
      Вопрос: как настроить приложение/форму/ТСкроллБокс так, чтобы при зажатии и движении пальца вверх/вниз на ТЕдите клавиатура не выезжала?
      На нативных приложениях описанного выше поведения я не замечал.
       
      Заранее спасибо!
       
    • От Features
      Добрый день.
      Есть весьма странная задача : разработать собственную клавиатуру для системы (а не чисто для своего приложения) (developer.android.com, пример реализации в Android Studio).
       Возможно ли средствами Firemonkey это реализовать, или придется делать обертки java классов и подключать их в проект?
      п.с. дабы не плодить темы, такая же задача стоит и для IOS (Реализация в XCode).
      Буду очень благодарен за помощь и наставление в нужное русло.)
    • От Ufomaster
      Как при переходе с эдита на эдит очистить предыдущий текст в клавиатуре, что бы он не попал в новый эдит при нажатии на любой символ? 
    • От Дениска
      на OnClose формы делаем так: 
        procedure TForm2.OnClose(Sender: TObject; var Action: TCloseAction); begin   Action := TCloseAction.caFree; end;   и освобождаем форму не Free, а DisposeOf:   Form2 := TForm2.Create(nil); Form2.ShowModal; Form2.DisposeOf;
    • От Tarik02
      Как конвертировать символ в виртуальный код клавиши для функции keybd_event на windows. Дело в том, что нужно конвертировать на android, так-как некоторые символы нужно передавать без конвертации.
  • Последние посетители   0 пользователей онлайн

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