KeyMap unter Windows

Anfängerfragen zum Programmieren mit PureBasic.
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

KeyMap unter Windows

Beitrag von delikanli_19_82 »

hallo leute,

wie kann ich unter Windows feststellen, welche Tastaturlayout gerade im System bzw. im Programmfenster verwendet wird?

Den Tastaturlayout sieht man ja in der Regel auf der Taskleiste rechts in Form von DE. Klickt man darauf, so kann man ja ein anderes Layout wählen.

Das ganze setzt natürlich vorraus, das man mehrere Tastaturlayouts eingerichtet hat.

mfg

kurt
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: KeyMap unter Windows

Beitrag von Regenduft »

GetKeyboardLayout_(0)

Der Parameter 0 besagt, dass es sich um den aufrufenden Thread handelt. Ist aber etwas tricky, da z.B. der Rückgabewert das Hardware Layout UND das "Software" Layout beinhaltet. Bin mir auch nicht ganz sicher, ob nur das unter Windows als Standard definierte Layout rückgegeben wird.

MSDN-Doku findest Du hier
(sollte es an englisch Kentnissen fehlen, einfach nochmal fragen)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

Re: KeyMap unter Windows

Beitrag von delikanli_19_82 »

Es liefert nur eine Zahl.

Wie ermittle ich nun daraus den Layout-Name wie DE, EN etc...
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

Re: KeyMap unter Windows

Beitrag von shadow »

ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: KeyMap unter Windows

Beitrag von ts-soft »

Code: Alles auswählen

Define Keyboard.s = Space(8)

GetKeyboardLayoutName_(Keyboard)
Debug Keyboard
Das ist dann der Language Identifier als String, den Du evtl. noch in das von Dir gewünschte Format bringen kannst.

Mist, zu langsam :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
delikanli_19_82
Beiträge: 173
Registriert: 30.11.2010 02:34

Re: KeyMap unter Windows

Beitrag von delikanli_19_82 »

ich habe jetzt eine weile rumgegoogelt, habe auch die microsoft links abgecheckt, bin aber nicht auf eine lösung gekommen, das meiner vorstellung entspricht.

in ordnung GetKeyboardLayout liefert mir die LanguageID, nun gut. aber wie erreiche ich mit dieser id letztendlich das was ich möchte?

ich weiß nicht so recht wie ich die sache mit dem ersten wort-teil und zweiten wort-teil wie bei dem ms-doku angesprochen an das kommen soll wie ich es will. habe kein nützliches beispiel gefunden. ich erhalte nur nummern.

GetKayboaryLayoutName liefert bei mir ebenfalls eine nummer als string zurück.

in endeffekt möchte ich eigentlich nur wissen, welche tastatur-layout der anwender in dem moment, an dem er in meinem programm tippt, verwendet. ich brauche ein system.

sowas wie en-US und de-DE_poolbook kann nicht gebrauchen. ich brauche schlicht weg einfach nur zum beispiel "en" für englisch, "de" für deutsch. Gut ich gehe mal davon aus das die erweiterung -US bzw DE_poolbook die art der tastatur wiedergeben, zb ob es sich um eine querty/z bzw. F-Tastatur oder was auch immer handelt.

hier unter http://msdn.microsoft.com/en-us/library ... 85%29.aspx wird zwar eine dicke tabelle presentiert. aber ich kann damit nicht viel anfangen.

muss ich jetzt den erhaltenen lang-id in zwei longs zerteilen? dann die werte in hex umwandelt und mir eine dicke select-statement basteln, damit ich rausbekomme, was gerade sache ist?

wenn ja, bräuchte ich einen beispiel in pb wie man das macht.

eigentlich wollte ich auf diese weise direkt zum keymap zurgreifen. das heißt eine art tastatur-array wie bei mac. damit ich weiß welche taste was representiert. bei windows ändern sich manche tastaturnummern beim ändern des keyboardlayouts mit. auf die weise jetzt eine eigene keymap-array für jede erdenkliche tastatur zu basteln scheint etwas zu weit hergeholt. es muss doch dafür eine einfachere lösung geben oder?

mfg

kurt
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: KeyMap unter Windows

Beitrag von Regenduft »

delikanli_19_82 hat geschrieben:muss ich jetzt den erhaltenen lang-id in zwei longs zerteilen? dann die werte in hex umwandelt und mir eine dicke select-statement basteln, damit ich rausbekomme, was gerade sache ist?
Fast korrekt. Musst "in zwei Bytes zerteilen". (Quelle: MSDN)

Code: Alles auswählen

+-------------------------+-------------------------+
|     SubLanguage ID      |   Primary Language ID   |
+-------------------------+-------------------------+
15                    10  9                         0   bit
delikanli_19_82 hat geschrieben:wenn ja, bräuchte ich einen beispiel in pb wie man das macht.
Meinst Du sowas?

Code: Alles auswählen

Structure WordBytes
  StructureUnion
    w.w
    b.b[2]
  EndStructureUnion
EndStructure

Define n.WordBytes

n\w = $2211

Debug Hex(n\w)
Debug Hex(n\b[0])
Debug Hex(n\b[1])
delikanli_19_82 hat geschrieben:eigentlich wollte ich auf diese weise direkt zum keymap zurgreifen. das heißt eine art tastatur-array wie bei mac. damit ich weiß welche taste was representiert. bei windows ändern sich manche tastaturnummern beim ändern des keyboardlayouts mit. auf die weise jetzt eine eigene keymap-array für jede erdenkliche tastatur zu basteln scheint etwas zu weit hergeholt. es muss doch dafür eine einfachere lösung geben oder?
Eine einfache Lösung wäre 'ne super Sache! Würde mich auch interessieren! Mit MapVirtualKeyEx_() und GetKeyNameText_() kann man (je nachdem was man will) einiges Basteln. Allerdings wird's bei MapVirtualKeyEx_() mit Tastenkombinationen blöd und bei GetKeyNameText_() ist die "Qualität des Strings" mies (beim Zahlenblock-Div kommt da z.B. "(Zahlenblock)" raus).
Ein Beispiel-Code gibt's hier, wobei das mehr für Debug-Zwecke und nicht direkt übernehmbar ist.

Falls Du aus der Identifier-Tabelle was bastelst würde ich lieb um den Code bitten (mit ganz viel Zucker oben drauf :mrgreen:)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten