powershell 检测键盘上按下的SHIFT键(仅Shift键)

new9mtju  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(291)

我正在启动PowerShell,并尝试使用在网上找到的以下代码来测试是否按下了shift键:

function Test-ControlKey
{
  # key code for Shift key:
  $key = 16

  # this is the c# definition of a static Windows API method:
  $Signature = @'
    [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
    public static extern short GetAsyncKeyState(int virtualKeyCode); 
  '@

  Add-Type -MemberDefinition $Signature -Name Keyboard -Namespace PsOneApi
  [bool]([PsOneApi.Keyboard]::GetAsyncKeyState($key) -eq -32767)
}

当我尝试运行这个函数时,我遇到了这个错误:
创建管道时出错。+ CategoryInfo:未指定:(:)[],父项包含错误记录异常+完全限定的错误ID:运行时异常
功能有什么问题,我怎么能只检测到shift键,而不是用另一个键按下。
谢谢你的帮忙
我试过其他方法从网上,但没有发现给予我一个好的结果

ecfdbz9o

ecfdbz9o1#

您收到的错误消息与函数本身无关,而是与您尝试运行它的方式有关。可能是您没有正确定义函数,或者代码的其他部分存在问题。
关于检测Shift键是否被按下,您提供的代码似乎是使用一个名为GetAsyncKeyState的Windows API方法来检查Shift键的状态。$key变量设置为值16,表示Shift键的虚拟键代码。
但是,此方法不会区分单独按下的Shift键和与另一个键组合按下的Shift键。如果您只想检测按下的Shift键,可以修改代码如下:

function Test-ShiftKey
{
  $shiftKeyCode = 0x10
  $keyState = [System.Windows.Forms.Control]::ModifierKeys
  return ($keyState -band [System.Windows.Forms.Keys]::Shift) -eq [System.Windows.Forms.Keys]::Shift
}

此代码使用System.Windows.Forms.Control类的ModifierKeys属性获取所有修改键(包括Shift)的当前状态。然后通过在键状态和Shift键代码(0x 10)之间执行按位AND运算并将结果与Shift键代码进行比较来检查是否按下了Shift键。
请注意,此代码需要System.Windows.Forms程序集,因此您需要将以下行添加到脚本的开头:

Add-Type -AssemblyName System.Windows.Forms

相关问题