powershell - 如何使用 powershell 在远程计算机上获取 Caps Lock 状态
问题描述
我尝试了以下命令,但我只得到一个值False
:
Invoke-Command -ComputerName Server01 -ScriptBlock {[console]::CapsLock}
当我在[console]::CapsLock
本地运行时,该命令有效。
解决方案
使用[Console]::CapsLock
[Console]::CapsLock
可以读取该属性以获取CapsLock
是 On 还是 Off ($true
或$false
):
[Console]::CapsLock
您也可以检查NumLock
with的状态[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 CapsLock
,0x90
是 的密钥 ID NumLock
。有关从 .NET 使用此 API 的更多信息,请参阅此页面,有关GetKeyState 本身的文档,请参阅此页面。
远程进行
我找不到任何可靠的远程执行此操作的方法,这是有道理的,就像CapsLock
每个会话设置一样 - 而不是系统范围的设置。即使假设有一种方法可以获取CapsLock
给定活动会话的状态,您也可以同时在一个远程系统上拥有多个用户会话,并且很难知道要查看哪个会话来查看其CapsLock
状态。
推荐阅读
- c# - 在 c# wpf 中,我可以动态地将 listview 列构建为类方法吗?
- java - MySQL 8 的休眠方言?
- android - 在 Android 中为所有屏幕尺寸和所有屏幕密度创建布局的最佳实践是什么
- javascript - Chrome 扩展程序 - 在 popup.html 中为当前选项卡激活脚本
- sharepoint - SharePoint Rest API 中的 SP.ObjectSharingInformation.getObjectSharingInformation
- selenium - 在远程 linux 服务器上以 head-ded(正常)模式运行 selenium chrome 驱动程序的风险?
- javascript - 我想使用 angularjs1 修改 json 的属性值,但修改后它会替换整个 json
- puppet - 如何使用 Augeas 和 Puppet 将导出语句添加到 bash_profile
- javascript - API的POST方法:如何传递数组?
- c# - 使用参数调用 C# CA 时无法调用 command.exe(SQL Server Setup.exe)