2013-03-21 5 views
11
  • VS 2010
  • Разработка 32-разрядное приложение, которое работает на 64-битной ОС (Win7, Win8 - настольное приложение)
  • C#
  • .NET 4.0
  • WinForms

Я нашел много потоков на запуск экранной клавиатуры Windows (osk.exe) из приложения, но я бегу в некоторых проблем. Похоже, что я запускаю 32-битное приложение в 64-разрядной ОС. Я пробовал код, размещенный WooCaSh здесь: Keyboard on the screen in WinFormsКак использовать Windows На экранной клавиатуры в WinForms C#

Но ни один из трех разных путей не работает для меня. Для пути «sysnative» Process.Start «Не удается найти указанный путь». Для путей system32 и osk.exe появляется диалоговое окно «Не удалось запустить экранную клавиатуру».

Я нашел возможный обходной путь здесь, который является немного более сложным, чем то, что я искал (пост по eryang): http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f/

  1. Есть ли более простой или правильный способ сделать это?
  2. Я надеялся, что запуск моего приложения на планшете автоматически запустит экранную клавиатуру, когда пользователь выберет текстовое поле, но не повезет. Это нормально или я что-то упускаю? EDIT: обнаружено, что клавиатура не запускается автоматически в Win8 при работе в рабочем режиме (это мое приложение): http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up-automatically/ По-видимому, это работает на планшетах Win7, но я не могу проверить, потому что у меня есть только таблетки Win8.
+0

Просто измените настройку целевой платформы в проекте EXE на «AnyCPU». –

+0

К сожалению, для некоторых сторонних программ, с которыми он взаимодействует, должен быть x86. – Tara

+0

Просто для тестирования я пошел дальше и перешел на «AnyCPU». Клавиатура по-прежнему не запускается на моем 64-разрядном рабочем столе Win7, но запускается на 64-разрядном планшете Win8. Есть идеи? – Tara

ответ

18

Я теперь запускать "сенсорную клавиатуру" в противоположность "On-Screen Keyboard" (который клавиатура я хотел на Windows 8 в любом случае) с:

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
string keyboardPath = Path.Combine(progFiles, "TabTip.exe"); 

this.keyboardProc = Process.Start(keyboardPath); 

Это работает на моем Win7 и Win8, независимо от моего 32-битного приложения в 64-разрядной ОС. Тем не менее, у меня все еще есть проблема с программным закрытием клавиатуры, когда я закончил. Процесс this.keyboardProc, похоже, не получает дескриптор и сразу имеет свойство HasExited = true. Это означает, что мои попытки закрыть или убить не получится.

Согласно этой теме, если пользователь вручную открывает клавиатуру (или я ее программно запускаю), клавиатура не будет автоматически закрываться/скрываться, когда текстовое поле теряет фокус: Windows 8 - How to Dismiss Touch Keyboard? Я пробовал обходное решение для установки фокуса на скрытая кнопка, но так как я запустил клавиатуру самостоятельно, она не закрывается автоматически.

+3

Отличная работа! Я потратил не менее часа на это дерьмо. Ваше решение помогло мне. – bump

+0

Работал для меня и на планшете Windows 10. Ничего похожего на сохранение живого динозавра ... – brady321

+0

Обратите внимание, что у вас могут не быть установлены функции «Компоненты планшетных ПК» ... если не удалиться из панели управления, программ и отключить функции Windows или на – Barry

12

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

 string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; 
     string onScreenKeyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe"); 
     onScreenKeyboardProc = System.Diagnostics.Process.Start(onScreenKeyboardPath); 

и закройте все клавиатуры с

  //Kill all on screen keyboards 
      Process[] oskProcessArray = Process.GetProcessesByName("TabTip"); 
      foreach (Process onscreenProcess in oskProcessArray) 
      { 
       onscreenProcess.Kill(); 
      } 

По какой-то причине onScreenKeyboardProc.Kill() или .close() не работает.

+0

IT отлично работает со мной:/ – IMAK

0

Запуск TabTip.exe больше не работает в Widnows 10 Anniversary Edition. Я обнаружил недокументированный COM-интерфейс для управления сенсорной клавиатурой.Проверьте код здесь https://stackoverflow.com/a/40921638/332528

4

Чтобы клавиатура открывалась автоматически, элементы управления должны реализовать некоторые шаблоны управления UI Automation, в частности ITextProvider/IValueProvider. Это неприятность, но она работает (и это более чистый способ, чем запуск некоторые * .exe)

Я написал пример приложения и короткую статью здесь: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/

+0

Фантастическая статья! Вы обнаружили способ заставить цифровую клавиатуру? –

1

Сенсорная клавиатура использует автоматизации пользовательского интерфейса. По некоторым причинам, которые являются для меня загадкой, стандартное окно редактирования Windows не использует автоматический интерфейс, в то время как другие элементы управления, такие как поле со списком, делают.


можно использовать реализацию автоматизации пользовательского интерфейса от UIAutomationClient.dll.

Для автоматизации ввода пользовательского интерфейса в приложение должен запускаться инициализатор класса внутреннего класса сборки UiaCoreApi.

В можно добиться того, что, например, по телефону не представляясь не-оп:

AutomationElement.FromHandle(IntPtr)(-1) 

Другой способ заключается в реализации автоматизации пользовательского интерфейса в явном виде. Для этого реализуйте интерфейсы ITextProvider/IValueProvider для соответствующего управления вводом.

Чтобы связать реализацию интерфейсов с элементом управления, обработайте WM_GETOBJECT window message с помощью lParam = RootObjectId.

Для примера реализации, см

Хотя интересно, элементы управления, для которых сенсорная клавиатура работает вне коробки (как поле со списком или редактирования пароля поле, увидеть ответ), не выполняют WM_GETOBJECT/RootObjectId. За ними должен быть другой механизм.


Наиболее распространенным «решение» этой проблемы, явно всплывать клавиатуры, запустив TabTip.exe или osk.exe, вряд ли приемлемо.

Если ничего другого, то потому, что нет чистого способа, чтобы скрыть клавиатуру открыла, запустив в TabTip.exe (решения включают в себя хак, как убийство процесса или отправки Esc ключа).

И на самом деле вышеупомянутый хак, похоже, больше не работает в Windows 10 Anniversary Update: Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition.