使用[Console]::CapsLock
可以读取[Console]::CapsLock 属性以获取CapsLock 是打开还是关闭($true 或$false):
[Console]::CapsLock
您也可以使用[Console]::NumberLock 来检查NumLock 的状态。
使用 MS Word
似乎远程会话无法根据物理键盘是否打开或关闭来反映CapsLock是打开还是关闭。
我找到了另一种方法,但没有办法自己测试,并且需要安装 Microsoft Word:
$word = New-Object -ComObject "Word.Application"
# Check CapsLock
$word.CapsLock
# Check NumLock
$word.NumLock
使用System.Windows.Forms 命名空间
第三种可能满足您需求的方法是使用 System.Windows.Forms 命名空间来读取大写锁定设置。
# Make System.Windows.Forms available in Powershell
Add-Type -AssemblyName System.Windows.Forms
# Check CapsLock
[System.Windows.Forms.Control]::IsKeyLocked( 'CapsLock' )
# Check NumLock
[System.Windows.Forms.Control]::IsKeyLocked( 'NumLock' )
使用 Win32 API
您还可以使用 Win32 API 检查状态:
# Compile some quick C# so we can `P/Invoke` to the native library
$signature = @"
[DllImport("USER32.dll")]
public static extern short GetKeyState(int nVirtKey);
"@
$Kernel32 = Add-Type -MemberDefinition $signature -Name Kernel32 -Namespace Win32 -Passthru
# Check CapsLock
[bool]( $Kernel32::GetKeyState(0x14) )
# Check NumLock
[bool]( $Kernel32::GetKeyState(0x90) )
0x14 是 CapsLock 的密钥 ID,0x90 是 NumLock 的密钥 ID。 See this page for more information on making use of this API from .NET 和 this page for the documentation of GetKeyState itself。
远程操作
我找不到任何可靠的远程执行此操作的方法,这是有道理的,因为CapsLock 是每个会话设置 - 而不是系统范围的设置。即使假设有一种方法可以获取给定活动会话的CapsLock 状态,您也可以同时在一个远程系统上拥有多个用户会话,并且很难知道要查看哪个会话来查看其CapsLock 状态。