Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   GetKeyboardState für US-Tastatur (https://www.delphipraxis.net/175619-getkeyboardstate-fuer-us-tastatur.html)

Furtbichler 4. Jul 2013 07:50

GetKeyboardState für US-Tastatur
 
Hi,

Ich habe einen 2D-Scanner an einer VCL-Anwendung als USB-Gerät. Der Scanner schickt die Virtual Key Codes, die von Windows dann übersetzt werden (nun ja, von der VCL, aber über die API).

Nun habe ich das Problem, das die PC z.B. ein kyrillisches Layout haben, aber der Scanner meint, dort wäre eine US-Tastatur. Nun könnte man ja entweder den Scanner oder den PC umkonfigurieren, aber das machen die nicht.

Ich verwende zum korrekten Empfangen diese Routine im OnKeyDown:

Delphi-Quellcode:
function GetCharFromVirtualKey(Key: Word): string;
 var
    keyboardState: TKeyboardState;
    asciiResult: Integer;
 begin
    GetKeyboardState(keyboardState) ;

    SetLength(Result, 2) ;
    asciiResult := ToAscii(key, MapVirtualKey(key, 0), keyboardState, @Result[1], 0) ;
    case asciiResult of
      0: Result := '';
      1: SetLength(Result, 1) ;
      2:;
      else
        Result := '';
    end;
 end;
Das klappt auch, sofern die Tastatur richtig eingestellt ist. wenn nicht, dann eben nicht. Nun meine Frage: Wie kann ich diese Funktion umschreiben, damit nicht das auf dem PC eingestellte Layout verwendet wird (ich vermute, das das so ist), sonder fix das englische Layout (US-EN)?

Danke für Stupser in die richtige Richtung.

Danke für Tips.

Sir Rufo 4. Jul 2013 07:54

AW: GetKeyboardState für US-Tastatur
 
MSDN-Library durchsuchenMapVirtualKeyEx ;)

Furtbichler 4. Jul 2013 21:13

AW: GetKeyboardState für US-Tastatur
 
Und als 3.Parameter von MapVirtualKeyEx? Die Locale der US-Tastatu-Dingenskirchen?
Na, mal probieren.

Danke.

Union 5. Jul 2013 10:34

AW: GetKeyboardState für US-Tastatur
 
Zitat:

Nun könnte man ja entweder den Scanner oder den PC umkonfigurieren, aber das machen die nicht.
Schade, bei den besseren Scannern schickst Du Ihnen ein PDF mit den entsprechenden Config-Codes, die lesen sie von oben nach unten ein und das wars. Es sei denn, der Scanner wird nicht nur für Deine Anwendung benutzt...

Furtbichler 5. Jul 2013 19:59

AW: GetKeyboardState für US-Tastatur
 
Eben, so macht man das normalerweise auch. Aber die eben nicht. Der Scanner ist US und die PCs sind tschechisch. Also versuche ich, das über eine vorgekaukelte US-Tastatur zu lösen.

Was die Sache noch lustiger macht: Ich habe noch nicht einmal den Scanner zum testen. Also muss ich mir ein Tool schreiben, was hoffentlich einen USB-Scanner simuliert: Ich schicke die Daten per Sendkeys zu meiner Anwendung.

Union 5. Jul 2013 20:05

AW: GetKeyboardState für US-Tastatur
 
Ich hab einen HID Scanner von DataLogic da. Und auch tschechische Kunden. Wenn Du willst kann ich das gerne bei mir testen mit einer Minianwendung.

FragenderHerbert 30. Okt 2014 16:24

AW: GetKeyboardState für US-Tastatur
 
Hallo, ich lese gerade hier mit und suche den Typ TKeyState. Wo ist der eigentlich definiert?

Hab gerade die Unit(s) Types und Windows konsultiert. Dort ist der Typ nicht. Wo dann?

Ich suche eine Tastaturabfrage für Deutsche oder US Tastatur, bei der ich den Ascii Code des Buchstaben und auch den Scancode der Funktionstasten (Cursor l,r,h,t, F1-F12, ... ) erhalte.

Oder geht das auscchließlich in der WndProc mit WM_KEY?

himitsu 30. Okt 2014 17:59

AW: GetKeyboardState für US-Tastatur
 
Was für ein TKeyState suchst du denn, bzw. von wo hast du denn diesen Bezeichner, welchen es im Delphi nicht gibt?

Erstmal gibt es den ScanCode und den KeyCode.
Der ScanCode ist der Code, welchen die Tastatur sendet. (siehe VirtualKeyCode ala VK_ESCAPE oder VK_F1)
Nur VK_0 bis KK_9 und VK_A bis VK_Z gibt es nicht als Konstanten, aber die kann man via Ord('A') selber per Cast generieren.
Sie bekommt man über GetKeyboardState, GetKeyState, GetAsyncKeyState, WM_KEY, OnKeyDown oder OnKeyUp.

Und die KeyCodes werden nach der Übersetzung und Zusammensetzung anhand des aktuellen Tastaturstatusses erstellt.
Das kommt z.B. OnKeyPress rein, oder muß über MapVirtualKey berechnet werden.

PS: VK_SHIFT mit Ord('A') ist ein A und ohne VK_SHIFT ist es ein a. (ScanCode -> KeyCode)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz