Deutsch
Eingangshalle

Tatstatur Layout einstellen

 
- Seite 1 -



Stephan
Sonneborn


Hallo zusammen,

ich möchte per Profan das Tastaturlayout auf Englisch umstellen.
Normalerweise mache ich das so:
DECLARE _Fontname$
DECLARE Fontname#
DIM Fontname#, ~KL_NAMELENGTH'9
DEF LoadKeyboardLayout(2) !"USER32", "LoadKeyboardLayoutA"
DEF GetKeyboardLayoutName(1) !"USER32","GetKeyboardLayoutNameA"
GetKeyboardLayoutName(Fontname#)
_Fontname$ = "000000409"
LoadKeyboardLayout(_Fontname$, ~KLF_ACTIVATE)

Aber das führt zu einer Zugriffsverletzung in USER32.DLL.

Wer weiß Rat?

(WIN10, 64Bit)

52 kB
Hochgeladen:21.03.2022
Ladeanzahl68
Herunterladen
 
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
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

27.03.2022  
 




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
 
22.03.2022  
 




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
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

27.03.2022  
 




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  [...] 
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

27.03.2022  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

3.092 Betrachtungen

Unbenanntvor 0 min.
Stephan Sonneborn13.01.2023
Georg Teles01.10.2022
Uwe ''Pascal'' Niemeier23.07.2022
Ernst29.05.2022
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie