Condividi tramite


Il presente articolo è stato tradotto automaticamente.

Input basato su schermo

Tastiera su schermo personalizzata con .NET Framework

Christopher Frenz

Scaricare il codice di esempio

La necessità di sviluppare applicazioni che richiedono altri input basati su schermo è cresciuta costantemente negli ultimi anni.Gli sviluppatori hanno tradizionalmente utilizzato sullo schermo dei dati di input per lasciare che gli individui che non potevano utilizzare la tastiera di un computer immettere dati o fare delle scelte, soprattutto nelle applicazioni di chiosco.

La rapida crescita di tavoletta e dispositivi portabili rende su schermo più pervasivo e utile che mai.Basta non guardare oltre un negozio di caffè locale o la modalità di trasporto pubblico di trovare persone assorto nel più recente "app" per il loro telefono cellulare o dispositivo tablet.Dato le aspettative di crescita nel mercato della telefonia mobile computing, non è difficile immaginare che una comprensione delle metodologie on-screen input sarebbe di grande beneficio per ogni sviluppatore.

Inoltre, oltre al mercato della telefonia mobile, sullo schermo tastiere sono anche sempre più popolare in applicazioni dove sicurezza è fondamentale, in quanto i dispositivi di input basati su schermo possono aiutare a prevenire informazioni utente dall'essere rubato utilizzando basato su hardware keylogger.Per esempio, mediazioni borsa online come TradeKing richiedono agli utenti di immettere tutte le password utilizzando una tastiera su schermo per aiutare la sicurezza di Spinta.Ma anche se sullo schermo tastiere possono contribuire a migliorare la sicurezza, hanno i propri potenziali rischi di prendere in considerazione.Mentre sullo schermo tastiere attenuare il rischio di qualsiasi basato su hardware keylogger, sono ancora potenzialmente suscettibile di approcci basati su software di registrazione ingresso, così come la tecnica più comune di "spalla navigare" per visualizzare i pulsanti di input che un utente preme.Ad esempio, un'applicazione utilizza video acquisito di una persona digitando in un iPad per identificare quali chiavi erano digitati allineando la posizione dei tasti premuti con un'immagine della tastiera iPad (vedere onforb.es/oobLp2).

Alcune tecniche di attenuare l'efficacia della spalla surf.Uno dei più comuni è una costante randomizzazione dei tasti per impedire la mappatura delle coordinate keypress catturati a qualsiasi chiave specifica.In questo articolo, creerò una tastiera su schermo che usi chiave randomizzazione utilizzando Microsoft.NET Framework.L'applicazione permetterà la tastiera su schermo per essere collegati all'applicazione particolare­cazione per cui sullo schermo input è auspicabile.Tuttavia, questo articolo descrive le tecniche necessarie per costruire sullo schermo tastiera e l'applicazione di esempio è stato progettato per illustrare queste tecniche, non per fornire un'applicazione completamente descritto tastiera.

L'On-Screen Keyboard GUI

Il primo passo è che stabilisce la GUI, che comprende una "chiave" per ogni lettera dell'alfabeto e ogni numero (vedere Figura 1).Prima di iniziare a trascinando i controlli sul form, tuttavia, ci sono alcuni problemi da considerare.Nella maggior parte.NET applicazioni (e altre applicazioni), ogni volta che si desidera che l'utente a presentare ingresso cliccando su qualcosa, il controllo standard da utilizzare sarebbero un tasto.Ma non è possibile utilizzare un controllo button in una tastiera su schermo perché su essere cliccato, un controllo button guadagni automaticamente la messa a fuoco del sistema operativo Windows.Perché l'input da tastiera è destinata ad andare all'applicazione attiva in primo piano (cioè, l'applicazione con la messa a fuoco), sullo schermo tastiera non dovrebbe mai guadagnare l'attenzione del sistema operativo.Piuttosto che utilizzare controlli button per chiavi, utilizzerò controlli label, invece, perché sostengono un evento Click, come pulsanti, ma a differenza di pulsanti non sono ammessi per ottenere la messa a fuoco.Etichette quindi fare una scelta ideale, in grado di rispondere ai clic senza avviare un cambiamento di focus applicativo — con un po ' di extra di codifica che vedrete nella prossima sezione.Ai fini dell'applicazione di esempio, queste etichette saranno denominate Label1 attraverso Label36.Un controllo textbox, TextBox1, viene creato anche per confrontare gli input dell'utente stipulati la tastiera su schermo con quelli che appaiono nell'applicazione esterna (vedere Figura 1).

The Design View of the On-Screen Keyboard GUI
Figura 1 visualizzazione progettazione dell'On-Screen Keyboard GUI

Restare di fuori del fuoco

Anche se utilizzando un controllo come un'etichetta è necessaria evitare di causare l'applicazione ricevere lo stato attivo del sistema operativo, non è sufficiente di per sé perché sullo schermo applicazione tastiera può anche ricevere lo stato attivo quando viene caricato il modulo stesso e quando la forma o qualsiasi controllo sul form viene scelto dal mouse.Per correggere questa situazione, è necessario aggiungere codice aggiuntivo all'applicazione di tastiera.

In primo luogo, per evitare che la forma guadagnando l'attenzione quando viene caricato in primo luogo, I'll aggiungere il codice seguente (sto utilizzando Visual Basic.NET) per l'applicazione:

Private Const WS_EX_NOACTIVATE As Integer = &H8000000
Protected Overrides ReadOnly Property CreateParams() As CreateParams
  Get
    CreateParams = MyBase.CreateParams
    CreateParams.ExStyle = CreateParams.ExStyle And WS_EX_NOACTIVATE
    Return CreateParams
  End Get
End Property

Questo codice esegue l'override di proprietà CreateParams del form, che viene utilizzata per la creazione di un oggetto form. Evitare eseguendo l'override di questa proprietà con lo stile della finestra WS_EX_NOACTIVATE, che la forma di venire in primo piano su caricamento, il che significa che carico sullo schermo tastiera non prenderà l'attenzione lontano da qualunque altra applicazione fu attiva al momento del lancio. Una volta che questo codice viene messo in atto, è importante quindi garantire che l'applicazione non può raggiungere la messa a fuoco tramite un clic del mouse. Aggiungendo questo codice compie che:

Private Const WM_MOUSEACTIVATE As Integer = &H21
Private Const MA_NOACTIVATE As Integer = &H3
Protected Overrides Sub WndProc(ByRef m As Message)
  If (m.Msg = WM_MOUSEACTIVATE) Then
      m.Result = MA_NOACTIVATE
    Else
      MyBase.WndProc(m)
    End If
End Sub

Questo codice esegue l'override di funzione WndProc del form, che il modulo utilizza per ricevere tutti gli input dell'utente. La funzione prevalente intercetta i messaggi WM_MOUSEACTIVATE, che vengono inviati quando viene fatto clic su una finestra inattiva su. Assicura anche che sullo schermo applicazione tastiera non guadagnare l'attenzione di conseguenza il click del mouse impostando il valore restituito della funzione su MA_NOACTIVATE. La condizione di "Else" del presente codice assicura che tutti gli altri messaggi di input del mouse sono passati attraverso, consentendo la tastiera su schermo applicazione per rilevare l'etichetta scatta senza mai guadagnare messa a fuoco.

Aggiunta la funzionalità di tastiera

A questo punto, ho una GUI per l'applicazione e il codice garantire che resta privo di messa a fuoco. Ora è il momento di aggiungere la funzionalità di tastiera reale. Il primo bit di questa funzionalità consente di creare una subroutine (AssignKeys) per assegnare tasti casuali ma uniche a ogni etichetta (vedere Figura 2).

Figura 2 assegnazione casuale, unici tasti a ogni controllo Label

Private Sub AssignKeys()
  Dim Character() As Char =
    {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _
     "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", _
     "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", _
     "X", "C", "V", "B", "N", "M"}
  Dim Keys(36) As Char
  Dim I, X As Integer
  Dim Rand As New Random()
  Dim Used(36) As Integer
  Dim Unique As Boolean = False
    Used(0) = -1
    For I = 0 To 35
      Unique = False
      X = Rand.Next(0, 36)
      If Character(X) <> " " Then
        Keys(I) = Character(X)
        Character(X) = " "
      Else
        Do Until Unique = True
          X = Rand.Next(0, 36)
          If Character(X) <> " " Then
            Keys(I) = Character(X)
            Character(X) = " "
            Unique = True
          End If
        Loop
        End If
  Next
    Label1.Text = Keys(0)
    Label2.Text = Keys(1)
    Label3.Text = Keys(2)
    Label4.Text = Keys(3)
    Label5.Text = Keys(4)
    Label6.Text = Keys(5)
    Label7.Text = Keys(6)
    Label8.Text = Keys(7)
    Label9.Text = Keys(8)
    Label10.Text = Keys(9)
    Label11.Text = Keys(10)
    Label12.Text = Keys(11)
    Label13.Text = Keys(12)
    Label14.Text = Keys(13)
    Label15.Text = Keys(14)
    Label16.Text = Keys(15)
    Label17.Text = Keys(16)
    Label18.Text = Keys(17)
    Label19.Text = Keys(18)
    Label20.Text = Keys(19)
    Label21.Text = Keys(20)
    Label22.Text = Keys(21)
    Label23.Text = Keys(22)
    Label24.Text = Keys(23)
    Label25.Text = Keys(24)
    Label26.Text = Keys(25)
    Label27.Text = Keys(26)
    Label28.Text = Keys(27)
    Label29.Text = Keys(28)
    Label30.Text = Keys(29)
    Label31.Text = Keys(30)
    Label32.Text = Keys(31)
    Label33.Text = Keys(32)
    Label34.Text = Keys(33)
    Label35.Text = Keys(34)
    Label36.Text = Keys(35)
  End Sub

La routine in Figura 2 crea una matrice (personaggio) che contiene tutti i caratteri alfanumerici selezionati a comparire sulla tastiera e quindi si applica il generatore di numeri casuali per selezionare un elemento casuale da questa matrice. Fino a quando l'elemento non è stata selezionata in precedenza, il carattere memorizzato in quel particolare elemento della matrice viene copiato in una matrice chiamata tasti. Questo processo si ripete fino a quando tutti i 36 caratteri sono assegnati alla matrice tasti, che rende casuale la posizione di ogni carattere della matrice. Una volta che la matrice è randomizzata, gli elementi della matrice chiavi vengono assegnati alla proprietà Text di ciascuna etichetta per consentire loro caratteri assegnati essere visualizzati sullo schermo. Questa subroutine AssignKeys viene chiamata inizialmente sull'esecuzione dell'evento Form_Load.

Ora che i personaggi sono stati assegnati alle loro rispettive chiavi, ho bisogno di aggiungere il codice che gestisce la conversione il mouse fa clic sulla tastiera su schermo applicazione nell'equivalente di invio la pressione di un tasto per l'applicazione di destinazione. A tale scopo, è necessario utilizzare l'API user32. dll, che Windows utilizza per gestire molte funzioni di interfaccia utente correlate quali la gestione della finestra e altre funzioni di gestione della finestra. Per configurare l'applicazione per rendere correttamente utilizzare questa funzionalità di API, I'll aggiungere le seguenti istruzioni DLL importazione alla classe Form:

<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function FindWindow(ByVal lpClassName As String, _
    ByVal lpWindowName As String) As IntPtr
End Function
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetForegroundWindow(ByVal hWnd As IntPtr) As Boolean
End Function

La API user32. dll verrà utilizzato ogni volta che un evento Label_Click è stato lanciato, perché ogni tale evento sarà simile il codice in Figura 3.

Figura 3 utilizza l'user32. dll API per eventi di Label_Click

Private Sub Label1_Click(ByVal sender As System.Object,_
  ByVal e As System.EventArgs) Handles Label1.Click
  Dim X As Char
  X = CChar(Label1.Text)
  Dim theHandle As IntPtr
  theHandle = FindWindow(Nothing, "Untitled - Notepad")
  If theHandle <> IntPtr.Zero Then
    SetForegroundWindow(theHandle)
    SendKeys.Send(X)
  End If
  TextBox1.Text = TextBox1.Text & Label1.Text
  AssignKeys()
End Sub

Quando si verifica un evento click di etichetta, la variabile "theHandle" viene utilizzata per archiviare l'handle di applicazione per l'applicazione a cui sullo schermo tastiera sta per inviare il proprio input. In questo caso, la maniglia di applicazione è stata impostata su una copia appena caricata di Notepad poiché è universalmente disponibile su tutti i sistemi Windows. Se l'handle di applicazione è attualmente presente sul sistema, l'applicazione tenendo handle mosse (blocco note) al primo piano e il carattere assegnate a quell'etichetta viene inviata all'applicazione. Il carattere viene anche aggiunto a qualsiasi testo trovato all'interno della casella di testo dell'applicazione tastiera per dimostrare che i personaggi che appaiono nel blocco note sono gli stessi caratteri ricevuti dall'applicazione tastiera stessa. Come ultimo passo, la subroutine AssignKeys viene nuovamente chiamata a re-randomize le posizioni chiave e rendere ancora più difficile la spalla surf. Questa procedura è illustrata nel Figura 4 e Figura 5, dove Figura 4 mostra una versione appena caricata dell'applicazione e Figura 5 dimostra sullo schermo tastiera e blocco note dopo diverse pressioni dei tasti sulla tastiera su schermo.

A New Instance of the On-Screen Keyboard
Figura 4 nuova istanza della tastiera su schermo

The On-Screen Keyboard Sending Input to Notepad
Figura 5: La tastiera su schermo l'invio di Input in blocco note

Protezione avanzata e Porting di Mobile

Questo articolo ha dimostrato lo sviluppo di una tastiera su schermo utilizzando il.NET Framework. Spero che esso ha fornito alcune informazioni sul come sullo schermo tastiera può essere sviluppato per l'uso nel migliorare la sicurezza di alcuni elementi dell'inserimento dei dati o da usare nel porting.NET applications per piattaforme mobili.

Christopher M. Frenz è l'autore dei libri programmazione, "Visual Basic e Visual Basic.NET per scienziati e ingegneri"(Apress, 2002) e" L'analisi Pro Perl"(Apress, 2005). Può essere raggiunto a cfrenz@gmail.com.

Grazie all'esperto tecnica seguente per la revisione di questo articolo: Robert Green