web-dev-qa-db-ja.com

プログラムでWindowsVista / 7の言語バーを更新する

ユーザー用に言語バー(複数の入力言語がインストールされている場合に表示されるシステムトレイの言語スイッチャー)を構成しようとしています。

language bar

HKCUの下のregkeysを使用して新しい言語を簡単に追加できますが、問題は、ユーザーが効果を確認するためにコンピューターを再ログインまたは再起動する必要があることです。

私が使用するキー(アクティブなセットアップでそれらを書き込んでいる)は、その下の「HKEY_CURRENT_USER\Keyboard Layout\Preload」にあり、そのキーはタイプREG_SZの名前/値です。

通常、 "1" = "0000407" "2" = "0000409"のようなキーはすでに存在します。これは、ユーザーがドイツ語と英語のキーボードレイアウトをインストールしていることを意味します。追加する場合は、イタリア語など、キー「3」を追加します。 = "0000410"。次のログオフ/ログインの後、変更はユーザーに表示されます。

今私がすでに試したことは、WM_SETTINGCHANGEや「RUNDLL32.EXEuser32.dll、UpdatePerUserSystemParameters」コマンドなどのさまざまなWindowsメッセージを送信することです。しかし、これまでのところ有用な結果はありません。

ここでアイデアが不足しているので、何百人ものユーザーをログオフ/ログオンさせるのはそれほど素晴らしいことではありません:/

私はまた、マウスクリックを自動化することも考えました(たとえば、autoitを使用)が、それは通常、それが何よりも多くの問題を引き起こします。

4
weberik

レジストリの編集に関する知識は非常に限られているため、これを行うべきではありませんが、Windowsが提供するメカニズムを使用してください。

Microsoftは、Windowsのほぼすべての機能へのアクセスを可能にするメインプログラミングインターフェイスとして Windows PowerShell を作成しました。残念ながら、言語に関連するPowerShell関数のファミリー International Settings Cmdlets は、Windows 8/Server 2012でのみ導入され、Windows7またはVistaでは使用できません。

それでも、MSDNの記事で説明されているように、Windows7またはVista用のソリューションは存在します。
国際設定のWindows Vistaコマンドライン構成

この手法の使用例は、 コマンドラインオートメーションを使用した地域および言語オプションの国際設定の構成 にあります。これは、基本的に、次のコマンドで特別に作成されたxmlファイルを使用します。

control intl.cpl,, /f:"intlsettings.xml"

以下にいくつかのサンプルxmlファイルを示します。

現在の言語を変更します

<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
    <!--User List-->
    <gs:UserList>
        <gs:User UserID="Current"/>
    </gs:UserList>
    <!-- User Locale-->
    <gs:UserLocale>
        <gs:Locale Name="es-US" SetAsCurrent="true"/>
    </gs:UserLocale>
</gs:GlobalizationServices>

キーボード言語を追加

<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"> 
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/></gs:UserList> 
<gs:InputPreferences> 
<gs:InputLanguageID Action="add" ID="0804:E0200804"/>
</gs:InputPreferences>
</gs:GlobalizationServices>

キーボード言語を削除します

<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"> 
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/></gs:UserList> 
<gs:InputPreferences> 
<gs:InputLanguageID Action="remove" ID="0804:E0200804"/>
</gs:InputPreferences>
</gs:GlobalizationServices>

ソース

2
harrymc