2013-03-21 7 views
11
  • VS 2010
  • Developing 32-bitowych aplikacji, która działa na 64-bitowym systemie operacyjnym (Win7, Win8 - app pulpitu)
  • C#
  • .NET 4.0
  • WinForms

znalazłem wiele wątków na uruchomienie systemu Windows na klawiaturze ekranowej (osk.exe) od aplikacji, ale używam do niektórych problemów. Wygląda na to, że uruchamiam 32-bitową aplikację na 64-bitowym systemie operacyjnym. Próbowałem kodu opublikowanego przez WooCaSh tutaj: Keyboard on the screen in WinFormsJak korzystać z systemu Windows na klawiaturze ekranu w C# WinForms

Ale żadna z trzech różnych ścieżek nie działa dla mnie. W przypadku ścieżki "sysnative" Process.Start "Nie można odnaleźć określonej ścieżki." W przypadku ścieżek system32 i osk.exe pojawia się okno dialogowe błędu "Nie można uruchomić klawiatury ekranowej".

znalazłem możliwego obejścia tutaj, co jest trochę bardziej skomplikowana, niż to, co szukałem (postu eryang): http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f/

  1. Czy istnieje łatwiejszy lub poprawny sposób to zrobić?
  2. Miałem nadzieję, że uruchomienie mojej aplikacji na tablecie spowoduje automatyczne uruchomienie klawiatury ekranowej, gdy użytkownik wybierze pole tekstowe, ale bez powodzenia. Czy to normalne czy coś mi brakuje? EDIT: Zauważyłem, że klawiatura nie jest automatycznie uruchamiana w Win8 w trybie pulpitu (którą jest moja aplikacja): http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up-automatically/ Najwyraźniej działa na tabletach Win7, ale nie mogę przetestować, ponieważ mam tutaj tylko tablety Win8.
+0

Wystarczy zmienić ustawienie celu platformy w projekcie EXE na "AnyCPU". –

+0

Niestety musi to być x86 dla jakiegoś oprogramowania innej firmy, z którym współdziała. – Tara

+0

Tylko do testowania, przeszedłem do przodu i zmieniono na "AnyCPU". Klawiatura nadal nie uruchomiłaby się na moim 64-bitowym pulpicie Win7, ale uruchamia się na 64-bitowym tablecie Win8. Jakieś pomysły? – Tara

Odpowiedz

18

Jestem teraz uruchomienie „klawiatura dotykowa” w przeciwieństwie do „klawiatury ekranowej” (co jest klawiatura Chciałem na Windows 8 i tak) z:

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

this.keyboardProc = Process.Start(keyboardPath); 

To działa na moim Win7 i Win8, niezależnie od mojej 32-bitowej aplikacji w 64-bitowym systemie operacyjnym. Jednak wciąż mam problem z programowym zamykaniem klawiatury, kiedy skończę. Proces, this.keyboardProc, wydaje się nie mieć uchwytu i od razu ma właściwość HasExited = true. Oznacza to, że moje próby zamknięcia lub zabicia zawiodły.

Zgodnie z tym wątkiem, jeśli użytkownik ręcznie otworzy klawiaturę (lub programowo ją uruchomię), klawiatura nie będzie automatycznie zamykać/ukrywać, gdy pole tekstowe straci ostrość: Windows 8 - How to Dismiss Touch Keyboard? Próbowałem obejścia problemu z ustawieniem fokusu na ukryty przycisk, ale od czasu, gdy sam uruchomiłem klawiaturę, nie zamyka się automatycznie.

+3

Świetna robota! Zmarnowałem co najmniej godzinę w tym gównie. Twoje rozwiązanie pomogło mi. – bump

+0

Praca dla mnie również na tablecie z Windows 10. Nie ma potrzeby utrzymywania żywego dinozaura ... – brady321

+0

Pamiętaj, że możesz nie mieć zainstalowanych funkcji okna "Komponenty komputera typu Tablet" ... jeśli nie masz dostępu do Panelu sterowania, programów i funkcji systemu Windows lub nie, – Barry

12

Miałem problemy z zamknięciem klawiatury ekranowej. Można rozpocząć klawiatury dotykowej z

 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); 

i zamknąć wszystkie klawiatury z

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

Z jakiegoś powodu onScreenKeyboardProc.Kill() lub .close() nie działa.

+0

IT działa dobrze ze mną:/ – IMAK

4

Aby klawiatura automatycznie się otworzyła, elementy sterujące muszą zaimplementować pewne wzorce kontroli automatyzacji interfejsu użytkownika, w szczególności ITextProvider/IValueProvider. Jest to uciążliwe, ale działa (i to jest bardziej przejrzysty sposób niż uruchomienie jakiś * .exe)

Napisałem aplikację przykładową oraz krótki artykuł tutaj: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/

+0

Fantastyczny artykuł! Czy znalazłeś sposób na wymuszenie klawiatury numerycznej? –

1

klawiatury dotykowej wykorzystującą automatyzację UI. Z pewnych powodów, które są dla mnie tajemnicą, standardowe pole edycyjne Windows nie implementuje interfejsu użytkownika automatycznie, podczas gdy inne kontrolki, takie jak pole kombi, robią.


Można zastosować implementację automatyzacji interfejsu użytkownika od UIAutomationClient.dll.

Aby automatyzacja interfejsu użytkownika była magicznie wstrzykiwana do aplikacji, należy uruchomić inicjator klasy złożenia klasy wewnętrznej UiaCoreApi.

On może osiągnąć na przykład poprzez wywołanie pozornie nie-op:

AutomationElement.FromHandle(IntPtr)(-1) 

Innym sposobem jest wprowadzenie automatyzacji UI wyraźnie. Aby to zaimplementować interfejsy ITextProvider/IValueProvider dla odpowiedniego sterowania wejściowego.

Aby powiązać implementację interfejsów z formantem, należy obsłużyć WM_GETOBJECT window message z lParam = RootObjectId.

Dla przykładu wykonania, patrz

Choć co ciekawe, kierownica, dla których klawiatura dotykowa działa out-of-the-box (jak pola kombi lub hasło polu edycyjnym, zobacz odpowiedź), nie wdrożyć WM_GETOBJECT/RootObjectId. Za nimi musi być inna maszyneria.


Najczęstszym „rozwiązanie” tego problemu, jawnie popup klawiaturę, uruchamiając TabTip.exe lub osk.exe, jest trudne do przyjęcia.

Jeśli na nic innego, bo wtedy nie ma czysty sposób, aby ukryć klawiaturę otwarte uruchamiając TabTip.exe (rozwiązania obejmują hacki jak zabicie procesu lub wysyłanie Esc klucz).

Rzeczywiście powyższy hack nie działa już w systemie Windows 10 Anniversary Update: Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition.

Powiązane problemy