Показать / Скрыть клавиатуру программно на Windows8

Я пытаюсь программно отобразить / скрыть клавиатуру в приложении Windows Metro. Сначала я думал, что смогу сделать это, используя свернутое текстовое поле и устанавливая фокус на нем. Но похоже, что это было запрещено в этомссылка на сайт, Ссылка также говорит о AutomationPeer и TextAutomationPeer для достижения этой цели. Есть ли ресурс о том, как их использовать?

заранее спасибо PK

 louis.luo12 апр. 2012 г., 21:41
Эта ссылка (social.msdn.microsoft.com/Forums/ha-Latn-NG/winappswithcsharp/…) указывает, что вы можете установить / убрать фокус наText Control показать / скрыть клавиатуру. Что именно вы пытаетесь сделать? Можете ли вы предоставить более подробную информацию? Если вы используете Javascript, вы можете попробовать поставитьdiv над текстовым полем, чтобы сделать его "невидимым" и реагировать на событие изменения ввода
 pkumar012 апр. 2012 г., 22:49
Мы пытаемся перехватить ввод с клавиатуры и отправить его на сервер, а также сервер может дать указание клиенту показать клавиатуру.
 mydogisbox24 июл. 2012 г., 22:55
 pkumar012 апр. 2012 г., 22:44
Обе ссылки говорят о невозможности показать клавиатуру: «Это означает, что приложения не могут программно вызывать сенсорную клавиатуру посредством манипуляции фокусом. В прошлом большими виновниками были веб-страницы, и многие из них по умолчанию фокусировались на поле ввода, но на их странице было доступно множество других возможностей, которые могут понравиться пользователю. Однако мы считаем, что требование пользователя коснуться поля ввода является приемлемым компромиссом. & Quot; & quot;
 pkumar012 апр. 2012 г., 22:48
Чтобы включить управляемый пользователем вызов, мы отслеживаем координаты последнего события касания и сравниваем их с расположением ограничительного прямоугольника элемента, который в данный момент имеет фокус. Если точка находится внутри ограничительного прямоугольника, вызывается сенсорная клавиатура.

Ответы на вопрос(5)

PowerShell Сценарий, который я использую, чтобы достичь этого. Вы можете сделать то же самое в C #, получив услугу и запустив / остановив ее в зависимости от ваших потребностей.

$serv = get-ciminstance win32_service -filter "name = 'TabletInputService'"
# if started stop it
if( $serv.State.equals("Running") ){
    Stop-Service TabletInputService
}
# if not set to disabled, disable it
# else set to auto and start
if( !$serv.StartMode.equals("Disabled") ){
    Set-Service TabletInputService -StartupType Disabled
    "TabletInputService Disabled"
}
else {
    Set-Service TabletInputService -StartupType Auto
    Start-Service TabletInputService
    "TabletInputService Enabled and Started"
}
 pkumar012 июл. 2013 г., 20:37
Сколько времени это займет? Я больше не работаю над продуктом, но это кажется немного медленным.
 12 июл. 2013 г., 20:50
это на самом деле значительно быстрее. Случается сразу для меня

в разделе Разное есть свойство с именем PreventKeyboardDisplayOnProgrammaticFocus, проверьте это и установите фокус вашего текстового поля следующим образом:

 HiddenSearchBox.Focus(FocusState.Programmatic);

Там пример с пользовательским AutomationPeer, который, кажется, полезен для вопроса.

Хорошее руководство по созданию программной логики клавиатуры.

О, это может помочь

Вот:

UI Automation is the mechanism through which developers communicate whether or not a particular UI element can receive text input. You must ensure that the appropriate accessibility properties are set in your apps so that the touch keyboard will know to appear when focus lands on a specific UI element. For Windows-provided controls, this will be done automatically because proper accessibility properties are set by default, but for custom controls and experiences you must do additional work to set the accessibility properties correctly; remember that the touch keyboard reacts to these properties.

If you use C# or C++, use an AutomationPeer object, and specifically a TextAutomationPeer. A Windows 8 Release Preview sample will demonstrate how to do this in C#. Remember that the control must also be editable and able to receive text to get the keyboard to invoke, in addition to having the appropriate accessibility settings. Indicating that something can receive text when it cannot will mislead accessibility tools and the users who rely on them.

To enable user-driven invocation, we track the coordinates of the last touch event and compare them to the location of the bounding rectangle of the element that currently has focus. If the point is contained within the bounding rectangle, the touch keyboard is invoked.

Так что выcannot программно показать клавиатуру. Подходящий способ скрыть / показать клавиатуру - настроить свой элемент управления на прием ввода с использованием объекта AutomationPeer.

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

Edit:

Есть несколько вещей, которые нужно проверить при реализации однорангового автоматизатора текста:

Make sure you either test with a real touch device or test using the simulator with the Basic Touch Mode tool. If you don't do this the automation peer won't activate since it is only activated by a stylus or a touch input (not mouse).

Make sure your custom control implements OnCreateAutomationPeer something like this:

protected override AutomationPeer OnCreateAutomationPeer() { return new CustomControl2AutomationPeer(this); }

Make sure your Automation Peer implements FrameworkElementAutomationPeer, ITextProvider and IValueProvider

Более подробная информация найдена в примереВот.

 26 авг. 2015 г., 02:08
+1 Хороший ответ. Для справки см. ТакжеCustom automation peers.
 pkumar030 сент. 2012 г., 07:02
Я не уверен, но я думаю, что даже метод автоматизации не работает. Я попробовал это, но не мог заставить это работать.
 18 февр. 2013 г., 12:03
Я попытался запустить приложение метростила с текстовым полем на моем компьютере с Windows 8. При нажатии на текстовое поле сенсорная клавиатура не появляется. Почему это так ? или он будет показан, если его запустить в планшете?

IsReadOnly = true и установите для индекса вкладки TextBox значение 0, чтобы клавиатура сфокусировалась на этом TextBox, но она понимает, что TextBox доступен только для чтения и не будет отображаться. :)

Ваш ответ на вопрос