Wie sagst du LSHIFT abgesehen von RSHIFT in WM_KEYDOWN Events?

7

Nach MSDN sollte wparam funktionieren halte den Schlüsselcode. Das Problem ist, wenn Sie shift drücken, ist der Code 16 (VK_SHIFT), aber ich muss zwischen VK_LSHIFT und VK_RSHIFT unterscheiden.

Für VK_CONTROL scheint es eine Problemumgehung zu geben:

%Vor%

Das Gleiche funktioniert jedoch nicht für VK_SHIFT:

%Vor%

Im letzten Beispiel wird immer nur LSHIFT angenommen.

    
cib 12.04.2013, 08:34
quelle

4 Antworten

11

Um zwischen der linken und der rechten Version der Umschalt-, Strg oder Alt-Taste zu unterscheiden, müssen Sie die Funktion MapVirtualKey() oder das Bit 'erweiterter Schlüssel' im lParam verwenden, das mit der Nachricht des virtuellen Schlüssels übergeben wurde. Die folgende Funktion führt diese Übersetzung für Sie aus: Geben Sie einfach den virtuellen Schlüsselcode und das lParam aus der Nachricht ein und Sie erhalten die entsprechenden Links / Rechts-spezifischen virtuellen Schlüsselcodes zurück:

%Vor%

Wenn der übergebene virtuelle Schlüsselcode nicht zu einer linken / rechten Version gehört, wird der ursprüngliche Schlüsselcode unverändert zurückgegeben. Sie können also die Nachrichtenparameter WM_KEYDOWN / WM_KEYUP / WM_SYSKEYDOWN / WM_SYSKEYUP über die Funktion ausführen, wenn Sie zwischen der linken und der rechten Variante unterscheiden müssen.

Wenn Sie MapVirtualKey() verwenden, müssen Sie die Kenntnisse über die Scancodes der linken und rechten Schicht, die 0x2a und 0x36 sind, nicht kennen - die API kümmert sich um diese Details. Und wenn sie jemals anders sein sollten (nicht dass das jemals wirklich passieren würde), wird Windows dafür verantwortlich sein, nicht Sie.

Also müssen Sie in Ihren WM_KEYDOWN / WM_KEYUP / WM_SYSKEYDOWN / WM_SYSKEYUP Handlern nur eine Codezeile hinzufügen, die wie folgt aussieht:

%Vor%

und der Rest Ihres Codes kann auf die links / rechtsspezifischen VK-Codes wirken, als ob die Systemnachricht sie Ihnen an erster Stelle gegeben hätte.

    
Michael Burr 12.04.2013, 17:40
quelle
6

Rufen Sie GetKeyState auf, indem Sie VK_LSHIFT oder VK_RSHIFT übergeben.

    
David Heffernan 12.04.2013 08:37
quelle
6

Hinter Ihrer Frage steckt eine alte Geschichte. Die ursprüngliche IBM PC-Tastatur hatte nicht die richtigen Tasten Alt und Strg. Sie wurden später auf dem erweiterten Tastaturlayout hinzugefügt, der Tastaturcontroller sendet sie mit dem Präfix 0xe0 an den Scan-Code, um sie als erweiterte Schlüssel zu unterscheiden. Aber das ursprüngliche Tastaturlayout hatte immer zwei Umschalttasten, so dass sie ihre eigenen nicht erweiterten Scancodes haben. Deshalb funktioniert dein Code nicht.

Davids Antwort ist ein guter Weg, um Ihr Problem zu lösen. Aber Sie können es wirklich aus der Nachricht herausholen, diese Scan-Codes werden von der Windows-Logoanforderungen . Verfügbar in lParam, die linke Shift-Taste hat Scan-Code 42, die rechte Shift-Taste ist 54. Nein # definieren in den Windows-Kopfzeilen für sie leider, das macht es hässlich.

    
Hans Passant 12.04.2013 09:38
quelle
1

"Nach MSDN":

  
  • VK_LSHIFT
  •   
  • VK_RSHIFT
  •   
  • VK_LCONTROL
  •   
  • VK_RCONTROL
  •   
  • VK_LMENU
  •   
  • VK_RMENU   
  •   

Diese links und rechts unterscheidbaren Konstanten stehen einer Anwendung nur über die Funktionen GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState und MapVirtualKey zur Verfügung.

    
kero 12.04.2013 09:19
quelle

Tags und Links