首页 > 解决方案 > 如何使用 powershell 在远程计算机上获取 Caps Lock 状态

问题描述

我尝试了以下命令,但我只得到一个值False

Invoke-Command -ComputerName Server01  -ScriptBlock {[console]::CapsLock} 

当我在[console]::CapsLock本地运行时,该命令有效。

标签: powershell

解决方案


使用[Console]::CapsLock

[Console]::CapsLock可以读取该属性以获取CapsLock是 On 还是 Off ($true$false):

[Console]::CapsLock

您也可以检查NumLockwith的状态[Console]::NumberLock

使用 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是 的密钥 ID CapsLock0x90是 的密钥 ID NumLock。有关从 .NET 使用此 API 的更多信息,请参阅此页面,有关GetKeyState 本身的文档,请参阅此页面。

远程进行

我找不到任何可靠的远程执行此操作的方法,这是有道理的,就像CapsLock每个会话设置一样 - 而不是系统范围的设置。即使假设有一种方法可以获取CapsLock给定活动会话的状态,您也可以同时在一个远程系统上拥有多个用户会话,并且很难知道要查看哪个会话来查看其CapsLock状态。


推荐阅读