| |
|
|
- Seite 1 - |
|
Stephan Sonneborn |
Hallo zusammen,
ich möchte per Profan das Tastaturlayout auf Englisch umstellen. Normalerweise mache ich das so:
Aber das führt zu einer Zugriffsverletzung in USER32.DLL.
Wer weiß Rat?
(WIN10, 64Bit) |
|
|
| Schöne Grüße aus Wittgenstein von Stephan
Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 21.03.2022 ▲ |
|
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
Georg Teles | Guten Abend,
ahem, die Funktion LoadKeyboardLayout erwartet eine Adresse zur LayoutID (Addr(TLayout#)) ... die Funktion UnloadKeyboardLayout erwartet wiederrum das Handle, welches von der Funktion LoadKeyboardLayout generiert wurde.
Im Beispiel habe schnell etwas gebastelt (aktuelles Layout wird ausgelesen, englische & danach tschechische Tastaturlayout werden hinzugefügt und anschließend entfernt & auf das ursprüngliche Layout eingestellt):
DECLARE aktuelle$, TLayout$, TLayout#, hLayoutID_en&, hLayoutID_cs&
DIM TLayout#, 9'~KL_NAMELENGTH'9
DEF LoadKeyboardLayout(2)! "USER32", "LoadKeyboardLayoutA"
DEF GetKeyboardLayoutName(1)! "USER32","GetKeyboardLayoutNameA"
DEF UnloadKeyboardLayout(1)! "USER32","UnloadKeyboardLayout"
cls
' aktuelle Tastatur
GetKeyboardLayoutName(Addr(TLayout#))
print "aktuelle Tastatur: "+String$(TLayout#,0)
print
' aktuelle speichern
aktuelle$ = String$(TLayout#,0)
WAITINPUT
' englische Tastaturlayout hinzufügen
TLayout$ = "00000409"
String TLayout#,0 = TLayout$
' englische Layout ID sichern !
hLayoutID_en& = LoadKeyboardLayout(Addr(TLayout#), 1)'~KLF_ACTIVATE)
print "LayoutID_en: ";(hLayoutID_en&);" (>0 = Erfolg, LayoutID)"
GetKeyboardLayoutName(Addr(TLayout#))
print "englische Tastatur: "+String$(TLayout#,0)
print
WAITINPUT
' tschechische Tastaturlayout hinzufügen
TLayout$ = "00000405"
String TLayout#,0 = TLayout$
' tschechische Layout ID sichern !
hLayoutID_cs& = LoadKeyboardLayout(Addr(TLayout#), 1)'~KLF_ACTIVATE)
print "LayoutID_cs: ";hLayoutID_cs&;" (>0 = Erfolg, LayoutID)"
GetKeyboardLayoutName(Addr(TLayout#))
print "tschechische Tastatur: "+String$(TLayout#,0)
print
WAITINPUT
' englische & tschechische Layout entfernen
print UnloadKeyboardLayout(hLayoutID_en&);" (1 = Erfolg/EN-Layout entfernt)"
print UnloadKeyboardLayout(hLayoutID_cs&);" (1 = Erfolg/CS-Layout entfernt)"
print
' auf ursprüngliches Layout zurücksetzen
String TLayout#,0 = aktuelle$
' vorheriges Layout neu laden !
print LoadKeyboardLayout(Addr(TLayout#), 1);" (1 = Erfolg)"'~KLF_ACTIVATE)
GetKeyboardLayoutName(Addr(TLayout#))
print "aktuelle Tastatur wiederhergestellt: "+String$(TLayout#,0)
'----------------------------------------------------
DISPOSE TLayout#
WAITINPUT
Edit: Bei LoadKeyboardLayout(Addr(TLayout#), 1) kann der String direkt benutzt werden: LoadKeyboardLayout(Addr(TLayout$), 1) wogegen die Funktion GetKeyboardLayoutName(Addr(TLayout#)) einen Bereich benötigt.
Grüße Georg |
|
|
| |
|
|
|
|
Sven Bader | Hallo Stephan,
bist du dir sicher, dass dies in Windows 10 überhaupt noch so einfach geht? Die Systeme riegeln solche tiefen Eingriffe ja immer weiter ab.
Mit meinen zwei Schüssen ins Blaue bin ich leider gescheitert, 1. Fontname# großzügiger dimensionieren, 2. Die erste "0" löschen, der Fehler kommt trotzdem auch bei mir.
Ich habe folgendes auf Stackoverflow gefunden, hier wird auch eine Null weniger verwendet und es wird kommentiert, dass das Keyboardlayout so lediglich bereitgestellt aber noch nicht aktiviert wird und eben in den Kommentaren der Verdacht, dass es unter Windows 10 nicht mehr geht. [...] (Stackoverflow)
Grüße Sven |
|
|
| |
|
|
|
Stephan Sonneborn | Hallo Sven, vielen Dank für Deine Tests. Ich hab inzwischen herausbekommen, dass die Übergabe eines Stings, z.B. "00000407" für DE oder "00000409" für EN das Tastaturlayout umstellt. Ich müsste jetzt nur noch wissen, wie das aktuelle Taststurlayout heißt. Also das, bevor ich es umstelle. Dann kann ich es am Programmende wieder zurückstellen... |
|
|
| Schöne Grüße aus Wittgenstein von Stephan
Programmierumgebung:| XProfan X4 | WIN10 | AMD FX6100 3,3 GHz | 24.03.2022 ▲ |
|
|
|
|
Georg Teles | Guten Abend,
ahem, die Funktion LoadKeyboardLayout erwartet eine Adresse zur LayoutID (Addr(TLayout#)) ... die Funktion UnloadKeyboardLayout erwartet wiederrum das Handle, welches von der Funktion LoadKeyboardLayout generiert wurde.
Im Beispiel habe schnell etwas gebastelt (aktuelles Layout wird ausgelesen, englische & danach tschechische Tastaturlayout werden hinzugefügt und anschließend entfernt & auf das ursprüngliche Layout eingestellt):
DECLARE aktuelle$, TLayout$, TLayout#, hLayoutID_en&, hLayoutID_cs&
DIM TLayout#, 9'~KL_NAMELENGTH'9
DEF LoadKeyboardLayout(2)! "USER32", "LoadKeyboardLayoutA"
DEF GetKeyboardLayoutName(1)! "USER32","GetKeyboardLayoutNameA"
DEF UnloadKeyboardLayout(1)! "USER32","UnloadKeyboardLayout"
cls
' aktuelle Tastatur
GetKeyboardLayoutName(Addr(TLayout#))
print "aktuelle Tastatur: "+String$(TLayout#,0)
print
' aktuelle speichern
aktuelle$ = String$(TLayout#,0)
WAITINPUT
' englische Tastaturlayout hinzufügen
TLayout$ = "00000409"
String TLayout#,0 = TLayout$
' englische Layout ID sichern !
hLayoutID_en& = LoadKeyboardLayout(Addr(TLayout#), 1)'~KLF_ACTIVATE)
print "LayoutID_en: ";(hLayoutID_en&);" (>0 = Erfolg, LayoutID)"
GetKeyboardLayoutName(Addr(TLayout#))
print "englische Tastatur: "+String$(TLayout#,0)
print
WAITINPUT
' tschechische Tastaturlayout hinzufügen
TLayout$ = "00000405"
String TLayout#,0 = TLayout$
' tschechische Layout ID sichern !
hLayoutID_cs& = LoadKeyboardLayout(Addr(TLayout#), 1)'~KLF_ACTIVATE)
print "LayoutID_cs: ";hLayoutID_cs&;" (>0 = Erfolg, LayoutID)"
GetKeyboardLayoutName(Addr(TLayout#))
print "tschechische Tastatur: "+String$(TLayout#,0)
print
WAITINPUT
' englische & tschechische Layout entfernen
print UnloadKeyboardLayout(hLayoutID_en&);" (1 = Erfolg/EN-Layout entfernt)"
print UnloadKeyboardLayout(hLayoutID_cs&);" (1 = Erfolg/CS-Layout entfernt)"
print
' auf ursprüngliches Layout zurücksetzen
String TLayout#,0 = aktuelle$
' vorheriges Layout neu laden !
print LoadKeyboardLayout(Addr(TLayout#), 1);" (1 = Erfolg)"'~KLF_ACTIVATE)
GetKeyboardLayoutName(Addr(TLayout#))
print "aktuelle Tastatur wiederhergestellt: "+String$(TLayout#,0)
'----------------------------------------------------
DISPOSE TLayout#
WAITINPUT
Edit: Bei LoadKeyboardLayout(Addr(TLayout#), 1) kann der String direkt benutzt werden: LoadKeyboardLayout(Addr(TLayout$), 1) wogegen die Funktion GetKeyboardLayoutName(Addr(TLayout#)) einen Bereich benötigt.
Grüße Georg |
|
|
| |
|
|
|
Georg Teles | Nabend nochmals,
die zum Schluss auskommentierte Zeile zuvor muss doch rein:
' vorheriges Layout geladen: da dieses bereits existiert hat, muss es nicht unbedingt
' neu geladen werden, nachfolgende Zeile kann hier vernachlässigt werden!)
'print LoadKeyboardLayout(Addr(TLayout#), 1);" (1 = Erfolg)"'~KLF_ACTIVATE)
wenn man mehrere Tastaturlayouts anfangs hat und das Beispiel ausführt, wird das erste Layout zum Schluss aus der Liste ausgewählt ... also lieber bewusst das vorherige Layout, was zuvor eingestellt war, laden. (habe die Zeile im vorherigen Post wieder kommentiert)
Edit: da fällt mir ein, hatte mal eine PCU geschrieben, die im Grunde die Liste der Sprachen beinhaltet (Sprachwerte in Dezimalangaben, diese müssen noch in Hexadezimale umgewandelt werden siehe für Deutsch 1031 = Hex 0407) [...]
hatte diese Liste dafür verwendet [...] |
|
|
| |
|
|