Standard-Tastaturlayout ändern
-
Hi,
wie kann man denn per WinAPI das Standard-Eingabegebietsschema ändern ?
Mit LoadKeyboardLayout gehts ja nur für die aktuelle Anwendung / Thread, ich will aber das Standard-Schema ändern, so dass jede Anwendung dann das Schema benutzt.Hat jemand damit Erfahrung oder ein Beispiel ??
Wäre sehr dankbar !!
-
Vielleicht mit SystemParametersInfo() mit SPI_SETDEFAULTINPUTLANG ?
Siehe http://msdn.microsoft.com/en-us/library/ms724947.aspx
HTH Martin
-
Hm, das sieht ziemlich gut aus !
Kann es erst morgen wieder probieren, werde mich nochmal melden, ob es geklappt hat !
Aber schonmal danke

-
Also funktioniert wunderbar:
nLangIdent = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN); BOOL bResult = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, &nLangIdent, 0); // German - Austria if (bResult) { cout << "Successfully !" << endl; cout << "--------------" << endl << endl; } else { cout << "Error !" << endl; cout << "Evtl. muess das Tastaturlayout erst im Windows hinzugefuegt werden !" << endl; cout << "Weitere Infos in den Regions- und Sprachoptionen !" << endl << endl; }Setzt genauso wie ich es will das Standard-Layout !
Vielen Dank für die Hilfe !!

-
Hi,
habe doch noch ein Problem:
Das Programm funktioniert, nur dauert es teilweise etwas lang, bis das von mir gewünschte Layout geändert wird.Kann man das dem System noch irgendwie mitteilen, dass die Änderung sofort stattfinden soll ?
PS: Habe jetzt als letzten Parameter in SystemParametersInfo SPIF_SENDCHANGE stehen, bringt aber keine Änderung.
-
Hmm, hab da nur wenig experimentelle Erfahrung speziell beim Ändern des Tastaturlayouts.
R3dNeXX schrieb:
Das Programm funktioniert, nur dauert es teilweise etwas lang, bis das von mir gewünschte Layout geändert wird.
Wie lange kann denn diese Änderung dauern? Bei meinen damaligen Experimenten ging das doch recht flott über die Bühne...
Ich denke mal, diese sollte nur einmalig erfolgen (und nicht etwa bei jedem Programmstart), und dann wohl nie wieder. Mit dieser Betrachtung könnte man die Wartezeit einigermaßen verschmerzen, oder?
Übrigens, diese Änderung sollte tunlichst nur vom Benutzer aus legitimiert werden, z.B. durch extra Menüpunkt oder Dialog-Button.
D.h. ein bloßer Programmstart sollte keinesfalls die Systemeinstellungen ändern, das verärgert möglicherweise viele User, die vielleicht doch ihre eigenen Einstellungen beibehalten möchten.R3dNeXX schrieb:
Habe jetzt als letzten Parameter in SystemParametersInfo SPIF_SENDCHANGE stehen, bringt aber keine Änderung.
Flag SPIF_SENDCHANGE sorgt dafür, daß nach der Änderung ein Broadcast (also Nachricht an alle laufende Prozesse) mit WM_SETTINGCHANGE gesendet wird.
Keine Änderung? Meinst Du das Tastaturlayout ist beim alten gleichgeblieben? Oder kommt kein WM_SETTINGCHANGE bei Dir an?
BTW, unabhängig davon: Ich denke mal, in Deinem Fall ist zusätzlich der Flag SPIF_UPDATEINIFILE notwendig.
Martin
-
Das ging ja schnell

Vielleicht täuscht das alles auch (wenn ich mir da jetzt hier so anschaue).Der Hintergrund der ganzen Geschichte:
Ich arbeite zurzeit mit Sitekiosk (damit kann man die Infoterminals super einrichten bzw. die Kiosksoftware, um es mal schnell zu erwähnen).
Dort habe ich 5 eigene Keyboard-Skins (für Touchscreen), nur ist da das Problem, dass ich (wenn ich z.B. meine ital. Tastatur nutzen will) immer das Layout ändern muss.Habe mir deshalb ein eigenes Programm geschrieben, dass ich beim Start dieser Kiosksoftware per Javascript starte und dann das Layout ändere. Also je nachdem, welches Skin verwendet werden soll.
Habe bis jetzt auch keine andere Idee, wie bzw. wann ich mein Programm noch starten kann.PS: Durch Setzen von SPIF_UPDATEINIFILE kriege ich von SystemParametersInfo immer wieder 0 zurück, ohne funktionierts ja.
EDIT: Nein passt schon, es geht doch schnell genug. Problem ist nur, dass ich beim Start der Software mein Programm starte und eig. auch nur für diese Software das Layout ändern will (oder auch für alle, Hauptsache in der Kiosksoftware passt es). Nur müsste ich glaub ich dann das Sitekiosk nochmal neustarten und hätte dann erst mein gewünschtes Layout.
Weiß nicht so recht, wie ich das für das Programm festlegen kann außer meine Anwendung vorher auszuführen.
-
Hi,
also melde mich doch nochmal, wollte nicht ein extra Fred aufmachen.
Konnte mich jetzt erst wieder ausgiebig damit beschäftigen und mir ist aufgefallen, dass meine Funktion grundsätzlich immer wieder fehlschlägt:WORD eng = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); BOOL bErg = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, &eng, 0); if (!bErg) ....bErg ist andauernd 0 und GetLastError liefert aber wiederum auch 0 (also erfolgreich) !

Habe schon am letzten Parameter und vorletzten Parameter rumgeschraubt, hat aber nix gebracht.
Kann mir jemand sagen, wo hier ein Fehler sein soll oder hat ein Beispielcode ??
Oder an was kann es denn sonst liegen ?
-
Hi, habs nur kurz überflogen, nichts analysiert, da bei mir die Zeit ein wenig zu knapp ist...
Deshalb vorab ein paar Tipps:
-Häufig werden bei SystemParametersInfo() bei Parameterübergabe verwechselt ob man denn eine Variable oder einen Pointer auf die Variable übergeben muß. Bitte prüfe das genau nach. Dies kann (und ist) bei jedem Parametertyp anders! Leider.
-Speziell beim Verändern von Eigenschaften: Ohne Admin-Rechte können die Änderungwünsche auch einfach so geblockt werden (dafür gibts ja die Admin-Einschränkungen für die einzelnen User).Martin
-
Hi, ich danke dir erstmal für die Antwort.
Werde es am Montag nochmal genau prüfen und dann nochmal Bescheid geben.
Ein schönes Wochenende !
-
Hi,
also hab nochmal etwas probiert, kriege trotzdem immer wieder 0 zurück (GetLastError liefert auch 0 zurück):
// Standard-Tastaturlayout ändern: wcout << endl << L"Standard-Tastaturlayout aendern" << endl; wcout << "-------------------------------" << endl; CheckKeyboardList(); WORD wLangIdent[5] = {0}; wLangIdent[0] = MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN); wLangIdent[1] = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); wLangIdent[2] = MAKELANGID(LANG_DUTCH, SUBLANG_DUTCH); wLangIdent[3] = MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH); wLangIdent[4] = MAKELANGID(LANG_ITALIAN, SUBLANG_ITALIAN); BOOL bErg = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, NULL, (PVOID)&wLangIdent[nKeyboardLang], SPIF_SENDCHANGE); if (!bErg) GenerateErrorMessage(L"Standard-Tastaturlayout aendern"); ...Habe auch mal zum Testen explizit in PVOID casten lassen, was aber kein Unterschied bringt (dachte ich mir schon
).Ich weiß nicht, wo noch ein Fehler im Aufruf der Funktion / bei der Parameterübergabe sein soll.
Und Admin bin ich auch auf der Kiste.Überseh ich noch was ??
-
Wie wäre es mit einem Minimum an Lesen der MSDN?
SPI_SETDEFAULTINPUTLANG Sets the default input language for the system shell and applications. The specified language must be displayable using the current system character set. The pvParam parameter must point to an HKL variable that contains the input locale identifier for the default language. For more information, see Languages, Locales, and Keyboard Layouts.
-
Ach verdammt !
Man, hab die ganze Zeit diese Angabe von dir in der MSDN nicht gesehen.Funktioniert, ein Beispiel:
// lädt French (France): HKL hkLoadKeyb = LoadKeyboardLayout(L"0000040c", KLF_ACTIVATE); BOOL bErg = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, &hkLoadKeyb, SPIF_SENDCHANGE); if (!bErg) ....Ich danke dir !
Sollte mal sehen, dass ich die MSDN mal aufmerksamer lese.