Tastendruck in Windows mit C++ erkennen

Muhammad Husnain 16 Februar 2024
  1. Arten von Windows-Anwendungen, die C++ verwenden
  2. Tastatureingabe in Windows-Anwendungen mit C++
  3. Tastendruck in Windows mit C++ erkennen
Tastendruck in Windows mit C++ erkennen

In dieser kurzen Anleitung wird erläutert, wie wir Tastendrücke in Windows-Anwendungen mit C++ handhaben können. Bevor wir fortfahren, sehen wir uns eine kurze Einführung in Windows-Anwendungen mit C++ an.

Arten von Windows-Anwendungen, die C++ verwenden

Es gibt zwei Arten von Anwendungen, die in C++ entwickelt werden können:

  1. Konsolenbasierte Anwendungen

    Konsolenanwendungen sind solche Anwendungen, die nur über die Befehlszeile ausgeführt werden und nur Text anzeigen können. Daher werden diese auch als Kommandozeilenanwendungen bezeichnet.

  2. Fensterbasierte Anwendungen

    Während Windows-basierte Anwendungen diejenigen Anwendungen sind, die mit der ursprünglichen nativen Windows-C-API entwickelt und im Gegensatz zu einer konsolenbasierten Anwendung als Fensteranwendung angezeigt werden. Diese Anwendungen werden verwendet, um Software im Fensterformat zu erstellen und können Text, Bilder und alles darin anzeigen.

    Es gibt viele Möglichkeiten, Windows-Anwendungen zu entwickeln: Wir können die Win32-API direkt verwenden und eine Schleife im C-Stil erstellen, um Windows-Ereignisse abzuhören. In ähnlicher Weise können Sie auch Windows-Anwendungen mit Microsoft Foundation Classes (MFC), einem objektorientierten Stil, erstellen und die Win32-API umschließen.

    Ein Entwickler muss sich speziell mit Windows-Meldungen innerhalb einer Windows-Prozedurfunktion befassen, wenn er ein Win32-Programm erstellt, das in einem Fenster ausgeführt wird. Eine Win32-Anwendung kann als 32-Bit- (x86) oder 64-Bit- (x64) Binärdatei erstellt werden.

Beim Erstellen einer Windows-Anwendung müssen wir uns auch um Tastaturereignisse kümmern.

Tastatureingabe in Windows-Anwendungen mit C++

Die Tastatur wird für eine Vielzahl von Zwecken verwendet, darunter:

  1. Zeicheneingabe: Text, der vom Benutzer in ein Dokument oder ein Bearbeitungsfeld eingegeben wird.
  2. Tastenkombinationen: Die Verwendung von CTRL+O zum Öffnen einer Datei ist ein Beispiel für einen Tastendruck, der Anwendungsfunktionen aufruft.
  3. Befehle vom Betriebssystem: Die Verwendung von ALT+TAB zum Umschalten zwischen Fenstern ist ein Beispiel für einen Tastendruck, der Systemfunktionen aufruft.

Bei der Bedienung der Tastatureingabe muss man sich um alle Fälle eines Tastendrucks kümmern. Wenn zum Beispiel die Taste B gedrückt wird, kann es zu folgenden Szenarien kommen:

  • B
  • b

Wenn außerdem die Strg-Taste gedrückt wird, führt das Drücken der B-Taste zu der Tastenkombination Strg+B, die die Abkürzung ist Befehl, um Text fett zu machen.

Schlüsselcodes

Das Betriebssystem generiert einen Scancode für eine gedrückte Taste. Diese Scancodes variieren von einer Tastatur zur anderen.

Diese Codes sind für alle Tastaturtasten eindeutig; Beispielsweise haben Schlüssel-Links und Schlüssel-Rechts unterschiedliche Scan-Codes. Da diese Codes alphanumerisch und schwer zu merken sind, übersetzt der Tastaturgerätetreiber diese Scancodes in virtuelle Tastencodes, die geräteunabhängig sind.

Die Bibliotheksdatei WinUser.h definiert die Konstanten für alle virtuellen Tastencodes mit Ausnahme der Zeichen A-Z und der Ziffern 0-9. Ihre virtuellen Codes werden ihren ASCII-Äquivalenten zugeordnet:

  1. Ziffern 0-9: Codes reichen von 0x30 bis 0x39
  2. Alphabete A-Z: Codes reichen von 0x41 bis 0x5A

Für alle anderen Tasten sind Konstanten definiert, die den Scancodes dieser Tasten zugeordnet sind; für die linke Pfeiltaste lautet der virtuelle Code beispielsweise VK_LEFT. Wie oben diskutiert, sind für die Zeichen mit den entsprechenden ASCII-Werten keine virtuellen Codes definiert.

Zum Beispiel gibt es keinen virtuellen Code für das Zeichen B als VK_B. Die Liste mit einigen der häufig verwendeten virtuellen Codes ist unten dargestellt:

Virtueller Code Code scannen Beschreibung
VK_LBUTTON 0x01 Linke Maustaste
VK_RBUTTON 0x02 Rechte Maustaste
VK_CANCEL 0x03 Control-Break-Verarbeitung
VK_MBUTTON 0x04 Mittlere Maustaste (Maus mit drei Tasten)
VK_XBUTTON1 0x05 X1 Maustaste
VK_XBUTTON2 0x06 X2 Maustaste
VK_BACK 0x08 Rücktaste
VK_TAB 0x09 Tab-Taste
VK_SHIFT 0x10 Shift Taste
VK_CONTROL 0x11 STRG-Taste
VK_MENU 0x12 Alt-Taste
VK_PAUSE 0x13 PAUSE-Taste
VK_CAPITAL 0x14 FESTSTELLTASTE
VK_NUMPAD0 bis VK_NUMPAD9 0x60 - 0x69 Nummernblock 0-9-Taste
VK_F1 bis VK_F12 0x70 - 0x7B Funktionstaste F1 bis F12
VK_NUMLOCK 0x90 NUM-Taste
VK_SCROLL 0x91 SCROLL LOCK-Taste
VK_LSHIFT 0xA0 Linke SHIFT-Taste
VK_RSHIFT 0xA1 Rechte UMSCHALTTASTE
VK_LCONTROL 0xA2 Linke STRG-Taste
VK_RCONTROL 0xA3 Rechte STRG-Taste
VK_LMENU 0xA4 Linke MENÜ-Taste
VK_RMENU 0xA5 Rechte MENÜ-Taste

Es gibt viele andere Codes, die Sie unter diesem Link finden können.

Tastendruck in Windows mit C++ erkennen

Jedes Mal, wenn eine Taste auf einer Tastatur gedrückt wird, wird ein Ereignis generiert. Eine Nachricht wird generiert, wenn eine Taste gedrückt wird, und diese Nachrichten sind ereignisgesteuert.

Den Zustand der gedrückten Taste können wir mit der Funktion GetKeyState() abrufen. Diese Funktion nimmt einen virtuellen Tastencode als Argument und gibt ein Flag zurück, das angibt, ob diese Taste gedrückt ist oder nicht.

Interessant ist die Methode GetKeyState(), die den Status der virtuellen Tastatur zurückgibt. Dieser virtuelle Zustand wird geändert, wenn Nachrichten aus der Warteschlange entfernt werden, und basiert auf dem Inhalt der Nachrichtenwarteschlange.

GetKeyState stellt eine Momentaufnahme der Tastatur bereit, wenn jede Nachricht in die Warteschlange gestellt wurde, wenn Ihr Programm Fensternachrichten verarbeitet. GetKeyState meldet den Tastaturzustand, wenn der Benutzer die Maustaste drückt; zum Beispiel, wenn die letzte Nachricht in der Warteschlange WM _BUTTONDOWN war.

Syntax:

if (GetKeyState(VK_SHIFT) & 0x8000) {
  // Shift down
}

Das Bit-Flag 0x8000 bestimmt, ob die Taste gerade gedrückt ist.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn