以编程方式刷新 Windows Vista/7 中的语言栏

以编程方式刷新 Windows Vista/7 中的语言栏

我正在尝试为我们的用户配置语言栏(当您安装多种输入语言时出现的系统托盘中的语言切换器)。

语言栏

我可以轻松使用 HKCU 下的 regkeys 添加新语言,但问题是用户必须重新登录或重新启动计算机才能看到效果。

我使用的键(我使用活动设置写入它们)位于“HKEY_CURRENT_USER\Keyboard Layout\Preload”中,该键下方是 REG_SZ 类型的名称/值。

通常已经有像“1”=“0000407”“2”=“0000409”这样的键,这意味着用户已经安装了德语和英语键盘布局,如果我想添加,比如说意大利语,我会添加键“3”=“0000410”。下次注销/登录后,用户可以看到更改。

现在我已经尝试过发送各种 Windows 消息,例如 WM_SETTINGCHANGE 或“RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters”命令。但到目前为止还没有任何有用的结果。

我没什么主意了,让数百名用户注销/登录并不是很好 :/

我也考虑过自动化鼠标点击(例如使用 autoit),但这通常会带来更多的麻烦而不是带来任何好处。

答案1

您不应该通过注册表编辑来执行此操作,因为我们对此的了解非常有限,但可以使用 Windows 提供的机制。

微软已经创建Windows PowerShell作为其主要编程接口,允许访问 Windows 中的几乎所有功能。不幸的是,与语言相关的 PowerShell 函数系列 国际设置 Cmdlet,仅适用于 Windows 8/Server 2012,不适用于 Windows 7 或 Vista。

尽管如此,Windows 7 或 Vista 确实存在解决方案,如 MSDN 文章中所述:
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>

来源

相关内容