Share via


Dieser Artikel wurde maschinell übersetzt.

Screen-basierte Input

Anweisungen auf dem Bil...

Christopher Frenz

Die Notwendigkeit zur Entwicklung von Anwendungen, die Bildschirm basierenden Eingaben erfordern ist in den letzten Jahren stetig gewachsen.Entwickler haben traditionell auf dem Bildschirm verwendet Dateneingabe, damit Personen, die eine Computer-Tastatur benutzen konnte Daten eingeben oder Entscheidungen, vor allem im Kiosk-Applikationen.

Das rasche Wachstum der Tablette und mobile Geräte macht allgegenwärtig und nützlicher als je zuvor auf dem Bildschirm einzugeben.Ein Blick der Notwendigkeit nicht vorbei an einen lokalen Coffee-Shop oder öffentliche Verkehrsmittel, Leute für ihr Mobiltelefon oder Tablet PC-Gerät vertieft in der neuesten "app" zu finden.Angesichts die Erwartungen für weiteres Wachstum in den mobilen Computer Markt, ist es nicht schwer, sich vorzustellen, dass ein Verständnis der auf dem Bildschirm Eingabe Methoden für alle Entwickler von großem Vorteil wäre.

Darüber hinaus zusätzlich zu den mobilen Markt, auf dem Bildschirm Tastaturen sind auch immer mehr populär in Anwendungen wo ist Sicherheit kritisch, weil bildschirmbasierten Eingabegeräte dazu beitragen, zu verhindern, dass Benutzerinformationen gestohlen mit Hardware-basierte Keylogger.Beispielsweise hat online Broker wie TradeKing müssen Benutzer geben alle Kennwörter mit einer Bildschirmtastatur, um Erhöhung Sicherheit helfen.Aber auch wenn auf dem Bildschirm Tastaturen zur Verbesserung der Sicherheit können, sie haben ihre eigenen Risiken zu berücksichtigen.Während auf dem Bildschirm Tastaturen das Risiko einer jeden Hardware-basierte Keylogger abzuwehren, sind sie noch potenziell anfällig für Eingabe Protokollierung Software-basierte Ansätze sowie die sehr viel häufiger Technik der "Schulter-Surfen" um die Eingaben Schaltflächen anzuzeigen, die ein Benutzer drückt.Eine Anwendung verwendet beispielsweise Videoaufnahme einer Person eingeben ein iPad um zu identifizieren, welche Schlüssel eingegeben wurden, indem Sie den Speicherort der die gedrückten Tasten mit einem Bild der Tastatur iPad ausrichten (finden Sie unter onforb.es/oobLp2).

Einige Techniken verringern die Wirksamkeit der Schulter-Surfen.Einer der häufigsten ist eine Konstante Randomisierung von Schlüsseln, die Zuordnung der erfassten Keypress Koordinaten zu einem bestimmten Schlüssel zu verhindern.In diesem Artikel werde ich schaffen eine Bildschirmtastatur, dass verwendet Schlüssel Randomisierung mithilfe des Microsoft.NET Framework.Die Anwendung erlaubt die Bildschirmtastatur mit bestimmten Appli verknüpft werden­zierung für die auf dem Bildschirm Eingabe wünschenswert ist.Allerdings, dieser Artikel beschreibt die Techniken, um zu bauen ein on-Screen Tastatur und die Beispielanwendung ist entwickelt, um diese Techniken, eine voll ausgestattete Tastatur-Anwendung nicht zu veranschaulichen.

Die On-Screen Keyboard GUI

Der erste Schritt ist die grafische Oberfläche, die einen "Schlüssel" enthält für jeden Buchstaben des Alphabets und jede Zahl auslegen (finden Sie unter Abbildung 1).Bevor Sie Sie Steuerelemente auf das Formular ziehen beginnen, gibt es jedoch einige Punkte zu berücksichtigen.In den meisten.NET-Anwendungen (und andere Anwendungen sowie), wann immer Sie den Benutzer Eingabe wollen durch Klicken auf etwas, die standard-Steuerelement zu verwenden, wäre eine Schaltfläche übermitteln.Verwenden Sie können jedoch ein Button-Steuerelement in eine Bildschirmtastatur, weil auf geklickt wird, ein Button-Steuerelement automatisch den Fokus des Windows-Betriebssystems erhält.Da Tastatureingaben dazu da ist, um die aktive Vordergrundanwendung (d. h. die Anwendung mit dem Fokus), gehen ein auf dem Bildschirm Tastatur sollte nie gewinnen den Fokus des Betriebssystems.Anstatt Button-Steuerelemente für Schlüssel zu verwenden, werde ich stattdessen Label-Steuerelemente verwenden, da sie ein Click-Ereignis unterstützen, wie Schaltflächen, aber im Gegensatz zu Schaltflächen sind nicht berechtigt, Fokus.Etiketten stellen daher eine ideale Wahl, wird in der Lage, auf Klicks reagieren, ohne initiiert eine Änderung der Anwendungsschwerpunkt — mit ein bisschen extra Codierung, die Sie im nächsten Abschnitt sehen.Für Zwecke der Beispielanwendung werden diese Bezeichnungen Label1 durch Label36 benannt.Eine Textbox TextBox1, entsteht auch Benutzereingaben eingegangenen vergleichen die Bildschirmtastatur mit denen, die in der externen Anwendung angezeigt (siehe Abbildung 1).

The Design View of the On-Screen Keyboard GUI
Abbildung 1 die Entwurfsansicht die On-Screen Keyboard GUI

Aufenthalt außerhalb des Fokus

Obwohl ein Steuerelement verwenden, z. B. eine Bezeichnung zu vermeiden, dass die Anwendung den Fokus des Betriebssystems erhält erforderlich ist, ist es nicht genug an sich da die On-Screen Tastatur Anwendung kann auch den Fokus erhalten beim Laden des Formulars selbst und wenn das Formular oder jedes Steuerelement auf dem Formular mit der Maus geklickt wird.Um diese Situation zu korrigieren, muss die Tastatur Anwendung zusätzlichen Code hinzufügen.

Zunächst werden um zu verhindern, dass das Formular den Fokus zu gewinnen, wenn es zuerst geladen wird, ich den folgenden Code hinzufügen (ich bin mit Visual Basic.(NET) für die Anwendung:

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

Dieser Code überschreibt die CreateParams-Eigenschaft des Formulars, die bei der Erstellung des Form-Objekts verwendet wird. Durch Überschreiben dieser Eigenschaft mit dem WS_EX_NOACTIVATE Fensterstil, ich verhindern das Formular in den Vordergrund nach Laden, was, dass die Verladung bedeutet der Tastatur wird nicht auf dem Bildschirm den Fokus weg von was auch immer andere Anwendung aktiv, zum Zeitpunkt der Einführung war an. Sobald dieser Code eingeführt wird, ist es wichtig, vergewissern Sie sich anschließend, dass die Anwendung nicht Fokus per Mausklick erreichen. Hinzufügen dieser Code führt, die:

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

Dieser Code überschreibt WndProc-Funktion des Formulars, die im Formular verwendet, um alle Benutzereingaben empfangen. Die überschreibende Funktion fängt WM_MOUSEACTIVATE Nachrichten, die gesendet werden, wenn auf ein inaktives Fensters geklickt wird. Es stellt auch sicher, dass die auf dem Bildschirm nicht Tastatur Anwendung den Fokus aufgrund eines Mausklicks gewinnen, indem Sie den Rückgabewert der Funktion auf MA_NOACTIVATE. Die Bedingung "Else" dieses Codes wird sichergestellt, dass alle anderen Maus input Nachrichten durchlaufen werden wodurch die fort-Schirm Tastatur Anwendung Beschriftung klickt, ohne jemals gewinnen Fokus zu erkennen.

Hinzufügen der Tastaturfunktionen

Zu diesem Zeitpunkt habe ich eine GUI für die Anwendung und Code, um sicherzustellen, dass es bleibt Fokus-frei. Es ist jetzt Zeit, um die tatsächlichen Tastatur-Funktionalität hinzufügen. Das erste Bit des diese Funktion erstellt eine Unterroutine (AssignKeys) jedes Etikett zufällige aber eindeutige Schlüssel zuweisen (siehe Abbildung 2).

Abbildung 2 zuweisen zufällige, eindeutige Schlüssel für jedes Label-Steuerelement

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

Die Routine in Abbildung 2 erstellt ein Array (Zeichen), die enthält alle alphanumerischen Zeichen auf der Tastatur angezeigt werden ausgewählt und wendet dann den Zufallszahlen-Generator, ein zufälliges Element aus diesem Array auszuwählen. Solange das Element bereits ausgewählt hat, wird das Zeichen in das jeweilige Element des Arrays gespeichert in ein Array namens Schlüssel kopiert. Dieser Prozess wird wiederholt, bis alle 36 Zeichen in das Keys-Array, den Speicherort der einzelnen Zeichen im Array shuffle zugewiesen sind. Sobald das Array nach dem Zufallsprinzip ist, werden die Elemente des Arrays Schlüssel der Text-Eigenschaft von jedem Etikett zugewiesen, damit ihre zugewiesenen Zeichen auf dem Bildschirm angezeigt werden können. Diese AssignKeys-Unterroutine wird zunächst über die Ausführung des Form_Load-Ereignis aufgerufen.

Nun, da ihre jeweiligen Schlüssel die Zeichen zugewiesen haben, ich brauche Code hinzufügen, der behandelt Konvertieren der Mausklicks auf der Bildschirmtastatur Anwendung in das Äquivalent eines Keypress an der Zielanwendung zu senden. Um dies zu tun, brauche ich zu nutzen die user32.dll-API, die Windows verwendet, um viele UI-bezogenen Funktionen wie Fenster Handhabung und anderen Fenster Management-Funktionen behandeln. Um die Anwendung so eingerichtet, dass richtig machen diese API-Funktionen verwenden, ich füge die folgenden DLL-Import-Anweisungen der Form-Klasse:

<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

Die user32.dll API wird jedes Mal, wenn ein Label_Click Ereignis gestartet wird, verwendet werden, da jedes Ereignisses den Code in ähnelt Abbildung 3.

Abbildung 3 Verwenden der Datei user32.dll API für Label_Click Ereignisse

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

Wenn ein Click-Ereignis auftritt, die Variable "Behandlungsweise" wird zum Speichern das Handle-Anwendung für die Anwendung, verwendet die On-Screen Tastatur wird seine Eingaben zu senden. In diesem Fall wurde das Anwendung-Handle für eine frisch geladene Kopie der Editor festzulegen, weil es universell auf allen Windows-Systemen verfügbar ist. Wenn das Handle Anwendung derzeit auf dem System vorhanden ist, wird die Anwendung mit diesem Handle (Notepad) wechselt zum Vordergrund und das Zeichen zugewiesen diesem Label an die Anwendung gesendet. Das Zeichen wird auch auf den Text innerhalb der Tastatur Anwendung Textbox zu zeigen, dass die Zeichen, die im Editor erscheinen dieselben Zeichen von der Tastatur-Anwendung selbst empfangenen angefügt. Als letzter Schritt wird die AssignKeys-Unterroutine erneut aufgerufen, um re-randomize die Schlüsselpositionen und Schulter-Surfen noch schwieriger zu machen. Diese Prozedur wird dargestellt Abbildung 4 und Abbildung 5, wo Abbildung 4 zeigt eine neu geladene Version der Anwendung und Abbildung 5 veranschaulicht, die auf dem Bildschirm Tastatur und Editor nach mehrere Tasten auf der Bildschirmtastatur.

A New Instance of the On-Screen Keyboard
Abbildung 4 neue Instanz der Bildschirmtastatur

The On-Screen Keyboard Sending Input to Notepad
Abbildung 5: Die fort-Schirm Tastatur senden Eingaben an Editor

Verbesserte Sicherheit und Mobile portieren

Dieser Artikel zeigt die Entwicklung der eine Bildschirmtastatur verwenden die.NET Framework. Ich hoffe, dass es bot einen Einblick in, wie On-Screen Keyboard für die Verwendung bei der Verbesserung der Sicherheits von bestimmten Elementen der Dateneingabe oder zur Verwendung in Portierung entwickelt werden können.NET-Anwendungen auf mobilen Plattformen.

Christopher M. Frenz ist der Autor der Programmierung Bücher, "Visual Basic und Visual Basic.NET für Wissenschaftler und Ingenieure"(Apress, 2002) und"Pro Perl Parsen"(Apress, 2005). Er kann erreicht werden unter cfrenz@gmail.com.

Dank der folgenden technischen Experten für die Überprüfung dieses Artikels: Robert Green