2013-03-21 14 views
11
  • VS 2010
  • Sviluppare a 32 bit app che gira su 64-bit OS (Win7, Win8 - desktop app)
  • C#
  • .NET 4.0
  • WinForms

ho trovato molte discussioni sul lancio di Windows tastiera su schermo (osk.exe) da un'applicazione, ma sono in esecuzione in alcuni problemi. Sembra che stia eseguendo un'applicazione a 32 bit su un sistema operativo a 64 bit. Ho provato il codice inviato da WooCaSh qui: Keyboard on the screen in WinFormsCome utilizzare Windows On Screen Keyboard in C# WinForms

Ma nessuno dei tre percorsi diversi funziona per me. Per il percorso "sysnative", Process.Start "Impossibile trovare il percorso specificato." Per i percorsi system32 e osk.exe, viene visualizzata la finestra di dialogo di errore "Impossibile avviare la tastiera su schermo".

ho trovato una possibile soluzione qui, che è un po 'più complicato di quello che cercavo (messaggio di Eryang): http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f/

  1. C'è un modo più semplice e corretto di fare questo?
  2. Speravo che l'esecuzione della mia app su un tablet avrebbe avviato automaticamente la tastiera su schermo quando l'utente seleziona una casella di testo, ma senza fortuna. È normale o mi manca qualcosa? EDIT: rilevato che la tastiera non viene avviata automaticamente in Win8 quando è in modalità Desktop (quale è la mia app): http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up-automatically/ Apparentemente funziona su tablet Win7, ma non posso testare perché ho solo tablet Win8 qui.
+0

Basta modificare l'impostazione di destinazione della piattaforma sul progetto EXE su "AnyCPU". –

+0

Sfortunatamente deve essere x86 per alcuni software di terze parti con cui interagisce. – Tara

+0

Solo per il test, sono andato avanti e cambiato in "AnyCPU". La tastiera non si avviava ancora sul mio desktop Win7 a 64 bit, ma si avvia sul tablet Win8 64-bit. Qualche idea? – Tara

risposta

18

Ora sto lanciando la "tastiera Touch" in contrapposizione alla "Tastiera su schermo" (che è la tastiera che volevo su Windows 8 in ogni caso) con:

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

this.keyboardProc = Process.Start(keyboardPath); 

Questo funziona sul mio Win7 e Win8, indipendentemente dalla mia app a 32 bit sul sistema operativo a 64 bit. Tuttavia, ho ancora il problema di chiudere la tastiera a livello di codice quando ho finito. Il processo, this.keyboardProc, non sembra ottenere l'handle e ha immediatamente la proprietà HasExited = true. Ciò significa che i miei tentativi di chiudere o uccidere falliscono.

In base a questa discussione, se l'utente apre manualmente la tastiera (o la lancio a livello di codice), la tastiera non si chiude automaticamente quando il campo di testo perde il fuoco: Windows 8 - How to Dismiss Touch Keyboard? Ho provato la soluzione alternativa di impostare lo stato attivo su pulsante nascosto, ma dal momento che ho lanciato la tastiera me stesso, non si chiude automaticamente.

+3

Ottimo lavoro! Ho sprecato almeno un'ora in questa merda. La tua soluzione mi ha aiutato. – bump

+0

Ha funzionato anche per me con Windows 10. Niente come mantenere vivo un dinosauro ... – brady321

+0

Si noti che potrebbero non essere installate le funzionalità di Windows "Componenti del Tablet PC" ... se non si goto il Pannello di controllo, Programmi e Disattiva le funzionalità di Windows spento o su – Barry

12

Ho avuto problemi a chiudere la tastiera su schermo. È possibile avviare la tastiera Touch con

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

e chiudere tutte le tastiere con

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

Per qualche motivo onScreenKeyboardProc.Kill() o .Close() non funziona.

+0

L'IT funziona perfettamente con me:/ – IMAK

4

Affinché la tastiera si apra automaticamente, i controlli devono implementare alcuni schemi di controllo dell'interfaccia utente, in particolare ITextProvider/IValueProvider. Si tratta di un fastidio, ma funziona (e si tratta di un modo più pulito di lanciare alcuni * .exe)

Ho scritto un'applicazione di esempio e un breve articolo qui: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/

+0

Articolo fantastico! Hai scoperto un modo per forzare una tastiera numerica? –

1

La tastiera touch sfrutta l'automazione interfaccia utente. Per alcuni motivi questo è un mistero per me, la casella di modifica standard di Windows non implementa l'interfaccia utente automatica, mentre altri controlli, come la casella combinata, lo fanno.


Si può usare l'esecuzione dell'automazione UI da UIAutomationClient.dll.

Per l'automazione UI da iniettare magicamente in un'applicazione, è necessario attivare l'inizializzatore di classe della classe interna dell'assieme UiaCoreApi.

On può realizzare che, per esempio chiamando apparente no-op:

AutomationElement.FromHandle(IntPtr)(-1) 

Un altro modo è quello di implementare l'automazione dell'interfaccia utente in modo esplicito. Per questo implementare le interfacce ITextProvider/IValueProvider per il rispettivo controllo di input.

Per collegare l'implementazione delle interfacce al controllo, gestire WM_GETOBJECT window message con lParam = RootObjectId.

Per un esempio di attuazione, vedi

Anche se è interessante notare che, i controlli, per i quali tocco tastiera funziona out-of-the-box (come casella combinata o casella di modifica della password, vedere la risposta), non implementare il WM_GETOBJECT/RootObjectId. Ci deve essere un meccanismo diverso dietro di loro.


La "soluzione" più comune a questo problema, a popup in modo esplicito la tastiera eseguendo il TabTip.exe o osk.exe, è difficilmente accettabile.

Se non altro, allora, perché non c'è modo pulito per nascondere la tastiera aperta eseguendo i TabTip.exe (soluzioni includono hack come uccidere il processo o l'invio di Esc chiave).

E in realtà il trucco precedente non sembra più funzionare in Windows 10 Anniversary Update: Show touch keyboard (TabTip.exe) in Windows 10 Anniversary edition.