【问题标题】:Programmatically change Keyboard Layout以编程方式更改键盘布局
【发布时间】:2022-04-20 15:30:39
【问题描述】:

我在瑞士公司环境中工作,使用de-CH 作为标准键盘布局,同时使用de-DE 键盘。

我可以手动将我的键盘设置更改为首选的de-DE-layout,将其设置为标准并分配一个快捷方式。

但是:不知何故,我的设置会在任意时间后消失(可能与管理员运行的更新有关),所以我必须每隔几天重复一次。

This 建议在 Win 8 中使用 Powershell 更改键盘布局的简单方法:

Set-WinUserLanguageList -LanguageList DE-DE

遗憾的是,我使用的是 Win 7。因此,我收到以下错误消息,作为 Powershell-dummy,我将其解释为 Win 7 中不存在 cmdlet 的简单声明:

PS C:\Users\b036081> Set-WinUserLanguageList -LanguageList DE-DE
Set-WinUserLanguageList : The term 'Set-WinUserLanguageList' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path 
is correct and try again.
At line:1 char:1
+ Set-WinUserLanguageList -LanguageList DE-DE
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Set-WinUserLanguageList:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

现在,Powershell 中还有另一种比较简单的方法吗?甚至在 C++、C#、Batch、VB...

非常感谢!

【问题讨论】:

  • P/Invoking to LoadKeyboardLayout 并将其包装为 cmdlet 应该可以做到这一点。但既然你的问题是关于一个比较简单的方法,那就不会了(但有人可以写)。
  • 询问您公司的 IT 管理员...
  • @JeroenMostert 会调查是否有任何其他失败,但是,我几乎不知道创建 ps-cmdlet。再一次,兴奋地学习新东西。谢谢你的想法
  • @scotru 在尝试将我的键盘设置为en-EN 时尝试了它而没有产生任何错误。但是,没有明显的效果

标签: powershell


【解决方案1】:

使用这个命令

powershell -command "Set-WinUserLanguageList -Force 'en-US'"

powershell -command "Set-WinUserLanguageList -Force 'fr-FR'"

【讨论】:

  • 如原问题所述,PS无法识别Set-WinUserLanguageList
  • 这个答案很有用;我们中的许多人不再使用 Windows 7。希望不是OP。 :-)
  • 对于Windows 7 安装Windows Management Framework 5.1 不会帮助你(((
【解决方案2】:

我认为你可以在注册表中更改它。

下面有一个注册表项:

HKU:\.Default\Keyboard Layout\Preload\

在注册表中轻松将其更改为国家代码 00000407 - de-de,这应该可以解决您的问题。

但首先你必须创建一个新的 PS-Drive,从注册表中“挂载”“HKEY_USERS”。

$psdrive = New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS

Set-ItemProperty -Path "HKU:\.DEFAULT\Keyboard Layout\Preload\" -Name 1 -Value "00000407"

$psdrive | Remove-PSDrive

【讨论】:

  • 我喜欢这个想法,我想这通常可行,但是:我不允许更改该注册表项(没有管理员权限)。你不可能知道的!
  • 无需创建psdrive:只需使用Registry::HKEY_USERS 而不是HKU:
  • 语言值 00000407 应该用双引号括起来作为字符串,否则 407 将作为 int 值。要更改注册表,应在管理员凭据下运行 PS 脚本。
【解决方案3】:

您可以通过 .NET 类轻松更改当前输入语言,如下所示:

Add-Type -AssemblyName 'System.Windows.Forms'
[System.Windows.Forms.InputLanguage]::CurrentInputLanguage = [System.Windows.Forms.InputLanguage]::InstalledInputLanguages | ? { $_.Culture -eq 'ru-RU' }

【讨论】:

  • 在带有 PowerShell 5 的 Windows 10 上,除非前面有 Add-Type -AssemblyName 'System.Windows.Forms',否则会失败并显示 Unable to find type [System.Windows.Forms.InputLanguage].。关于 System.Windows.Forms 命名空间的一些东西让我觉得这对 PowerShell 来说不会很有效......
  • 这完全取决于任务。有些人可能对编辑注册表有限制。这只是另一种方法。
  • @Kirill Pashkov,虽然我没有收到错误消息,但在玩一会儿时我看不到任何效果。但是,这可能与我的用户配置文件中的限制有关。仍然:非常感谢这种替代方法!
  • 注意:这仅用于设置当前输入语言为当前线程System.Windows.Forms.InputLanguage 类的上游文档在这里:docs.microsoft.com/en-us/dotnet/api/…
【解决方案4】:

选项 1:WinDefaultInputMethodOverride

您可以覆盖默认输入法。 InputTip语言标识符键盘标识符的组合。 (Default Input Profiles (Input Locales) in Windows)

Set-WinDefaultInputMethodOverride -InputTip '0409:00000409'

选项 2:更新注册表

为此,您必须被允许更改注册表。

Set-ItemProperty -Path 'Registry::HKEY_USERS\.DEFAULT\Keyboard Layout\Preload\' -Name 1 -Value 00010409

标识符

键盘标识符列表可以在Keyboard Identifiers and Input Method Editors for Windows 上找到。在注册表中,您可以找到系统上可用的注册表。 语言标识符可以在Available languages for Windows

上找到
Get-ChildItem -Path 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Keyboard Layouts\'

【讨论】:

    【解决方案5】:

    在 PowerShell 窗口中运行以下命令:

    Set-WinDefaultInputMethodOverride -InputTip "0409:00000409"
    

    此命令将默认输入法覆盖设置为英语(美国) - 美国。

    Another Input Profiles (Input Locales) here

    【讨论】:

      【解决方案6】:

      如果我将任何其他语言设置为默认语言,我的系统会自动重置为de-CH 布局,但我仍然可以使用ALT+SHIFT+1...因为我不会尝试删除未使用的de-CH 条目。

      Powershell 方法似乎不适用于我的系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多