Italia
Eingangshalle

Tatstatur Layout einstellen

 
- Page 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
Downloadcounter68
Download
 
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 necessario.

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 per Deine Tests. Ich hab inzwischen herausbekommen, dass die Übergabe eines Stings, z.B. "00000407" per DE oder "00000409" per EN das Tastaturlayout umstellt. Ich müsste jetzt nur noch wissen, wie das aktuelle Taststurlayout è. 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 necessario.

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 per Deutsch 1031 = Hex 0407)  [...] 

hatte diese Liste dafür verwendet  [...] 
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

27.03.2022  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

3.130 Views

Untitledvor 0 min.
Stephan Sonneborn13.01.2023
Georg Teles01.10.2022
Uwe ''Pascal'' Niemeier23.07.2022
Ernst29.05.2022
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Eingangshalle  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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