Kann ich die Tastatureingabe eines Benutzers ändern?

8

Ich habe diesen Tastatur-Hook-Code gefunden, den ich für meine Zwecke leicht modifizieren möchte: Ссылка

Als Übersicht möchte ich, dass der Benutzer eine Taste drückt, "E" sagt und die Tastatur ein anderes Zeichen, "Z", an die App zurückgibt, die gerade scharf ist.

Die relevante Methode, die ich geändert habe, sieht jetzt so aus:

%Vor%

Die Konsole gibt das richtig aus als:

%Vor%

JEDOCH gibt die Fokus-App immer noch "E" anstelle von "Z" ein. Warum? Ich änderte die Tastatureingabe, um 'Z' anstelle von 'E' zu enthalten, und die Konsolenlinien zeigen, dass es richtig geändert wurde!

Wie ich es verstehe, ruft das Aufrufen von return CallNextHookEx(_hookID, nCode, wParam, lParam); den Befehl "print this now" an die geöffnete App. Geht das nicht so? Gibt es etwas, das mich daran hindert, den Charakter einzugeben, den ich möchte? Ich weiß, Apps wie AutoHotkey nehmen einen Eingabeschlüssel, überprüfen ihn und geben ein anderes Zeichen zurück. Wie mache ich das gleiche hier?

Danke!

    
cksubs 14.01.2010, 20:39
quelle

2 Antworten

5

Ich habe das schon mal gemacht, aber ein bisschen anders.
Anstatt zu versuchen, die an CallNextHookEx gesendeten Parameter zu ändern, habe ich den Tastendruck "geschluckt" (Sie können dies tun, indem Sie einen Wert ungleich Null von der Hook-Prozedur zurückgeben, um zu verhindern, dass nachfolgende Prozeduren aufgerufen werden).

Dann habe ich SendInput verwendet, um den neuen Schlüssel zu senden, den ich wollte "spritzen".

Im Prinzip funktioniert das so:

  • Hook-Prozedur identifiziert eine Zieltaste, die gedrückt wird
  • Aufruf an SendInput mit dem neuen Schlüssel
  • Geben Sie 1 von der Hook-Prozedur zurück, um den ursprünglichen Schlüssel zu ignorieren

Seien Sie vorsichtig bei zyklischen Weiterleitungen, d. h. "a" wird zu "b" umgeleitet, um zu "a" umgeleitet, es kann leicht explodieren;)

    
Idan K 14.01.2010, 21:06
quelle
0

Sie haben wahrscheinlich den Hook "thread wide" und nicht "system wide" installiert, was bedeutet, dass die Schlüsselübersetzung nur für den Thread erfolgt, der den Hook installiert.

Um es "systemweit" zu installieren, benötigen Sie zwei Teile: eine DLL mit dem "hook provider" und eine exe, die sie verwaltet. Hier ist ein gutes Tutorial Ссылка und hier ein Beispiel: Ссылка

Aber: 1. Das Installieren systemweiter Haken kann Ihr System ernsthaft vermasseln (stellen Sie sicher, dass Sie die Schlüssel weiterleiten, die Sie nicht übersetzen). 2. Bitte ... erstellen Sie keinen anderen Keylogger

    
Madalina Dragomir 14.01.2010 21:05
quelle