Assistance à l’aide de SystemParametersInfo

Je suis resté bloqué en essayant d’utiliser SystemParametersInfo. J’utilise le clavier Dvorak, alors j’essaie de faire un exe que je peux double-cliquer chaque fois que je veux changer la disposition du clavier. J’utilise SystemParametersInfo avec C #. Je peux récupérer la langue d’entrée actuelle très bien. Mais lorsque j’essaie de définir la langue d’entrée, j’obtiens une valeur de retour false et la langue de saisie ne change pas.

Merci d’avance pour toute aide.

Voici le code que j’utilise:

class KeyboardSwitcher { [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref uint pvParam, uint fWinIni); private const uint SPI_GETDEFAULTINPUTLANG = 0x0059; private const uint SPI_SETDEFAULTINPUTLANG = 0x005A; private const uint SPIF_UPDATEINIFILE = 0x01; private const uint SPIF_SENDWININICHANGE = 0x02; private const uint DVORAK = 0xF0020409; private const uint QWERTY = 0x04090409; static void Main(ssortingng[] args) { uint currentLayout = 0; uint newLayout = 0; bool result = false; int error = 0; SystemParametersInfo(SPI_GETDEFAULTINPUTLANG, 0, ref currentLayout, 0); if(currentLayout != DVORAK) { newLayout = DVORAK; /*result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);*/ result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_SENDWININICHANGE); error = Marshal.GetLastWin32Error(); } else { newLayout = QWERTY; /*result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);*/ result = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, ref newLayout, SPIF_SENDWININICHANGE); error = Marshal.GetLastWin32Error(); } Console.WriteLine(">>> Current Layout <<>> New Layout <<>> " +result); Console.WriteLine(error); Console.WriteLine(">>> Final Layout <<<"); uint finalLayout = 0; SystemParametersInfo(SPI_GETDEFAULTINPUTLANG, 0, ref finalLayout, 0); Console.WriteLine("0x" +finalLayout.ToString("X")); Console.WriteLine("Press any key to continue..."); Console.ReadKey(true); } } 

METTRE À JOUR:

J’ai jeté dans Console.WriteLine (Marshal.GetLastWin32Error ()); avec le rest des instructions d’impression et il retourne 0. Avant de lire les commentaires, j’ai également essayé GetLastError () en important Kernel32.dll et il a également renvoyé 0. Merci pour vos réponses.

MISE À JOUR 2: J’ai changé mon code pour montrer mon utilisation de GetLastWin32Error ().

Voici la sortie lorsque Dvorak est défini comme langue d’entrée par défaut.

 >>> Current Layout <<>> New Layout <<>> True Error Code >>> 0 >>> Final Layout <<< 0x4090409 Press any key to continue... 

Voici la sortie lorsque Qwerty est défini comme langue d’entrée par défaut.

 >>> Current Layout <<>> New Layout <<>> True Error Code >>> 0 >>> Final Layout <<< 0xF0020409 Press any key to continue... 

J’ai obtenu les valeurs hexadécimales pour les mises en page à l’aide de SPI_GETDEFAULTINPUTLANG lorsque chaque disposition était définie par défaut. Pensez-vous que la valeur renvoyée peut être différente de la valeur que je dois envoyer?

J’ai fait quelques recherches sur la classe InputLanguage et je ne crois pas qu’elle soit adaptée à cette situation car la propriété DefaultInputLanguage n’a pas de setter et il n’y a pas d’autres méthodes pour définir le langage d’entrée par défaut.

UPDATE 3: Lorsque je change le quasortingème paramètre de SystemParametersInfo sur SPIF_SENDWININICHANGE, il devient beaucoup plus proche du travail. Le résultat du SET est True et quand je lance le programme dos à dos, il change de langue. Cela signifie donc que quelque chose dans Windows est en train d’être modifié. Cependant, le changement est nouveau dans le panneau de configuration et le clavier ne change pas. J’ai l’impression que j’ai besoin de SPIF_UPDATEINIFILE pour faire passer le changement. La valeur que j’utilise est correcte, n’est-ce pas? J’ai également mis à jour le code et la sortie afin que la sortie soit un peu plus détaillée.

Pour informer une application que la langue a changé sans la redémarrer, vous devez envoyer à la fenêtre d’application un fichier WM_INPUTLANGCHANGEREQUEST suivi d’un message WM_INPUTLANGCHANGE où lParam est l’identificateur de parameters régionaux.