用Powershell听一下按键,但不要等待

时间:2014-10-27 17:24:09

标签: powershell

我正在尝试编写一个定期切换大写锁定键的脚本,但我也希望能够切换脚本,因为它会导致其他功能出现问题(例如alt tabbing,以及滚动窗口)任务栏看预览)

我到目前为止的脚本是

:outer while($true){
    do{ 
    echo "Toggle with F12";
    $x = [System.Console]::ReadKey() 
    }while( $x.Key -ne "F12" )
    while($true){
        $wsh = New-Object -ComObject WScript.Shell
        $wsh.SendKeys('{CAPSLOCK}')
        sleep 0.3
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wsh)
        Remove-Variable wsh
        if ($Host.UI.RawUI.KeyAvailable) {
            $key = $Host.UI.RawUI.ReadKey()
            if($key.Key -ne "F12"){
                break outer
            }
        }
    }
}

脚本等待用户按F12,然后一旦按下F12,我希望它开始切换大写锁定键0.3秒,直到用户再次按下F12。理想情况下,我希望这在背景中发生,但我不知道这是否可能。我不希望用户必须打开控制台窗口才能切换脚本。

现在运行的方式是,在用户按下F12后,脚本将切换一次,然后退出。如果我删除Remove-Variable之后的条件,脚本将按照我的意愿运行,除非它可以停止的唯一方法是控制台窗口关闭。

2 个答案:

答案 0 :(得分:6)

这是一个尝试。顺便说一句,我将睡眠时间改为1秒,因此在测试时不会过多地闪烁死锁:

$continue = $true
while($continue)
{

    if ([console]::KeyAvailable)
    {
        echo "Toggle with F12";
        $x = [System.Console]::ReadKey() 

        switch ( $x.key)
        {
            F12 { $continue = $false }
        }
    } 
    else
    {
        $wsh = New-Object -ComObject WScript.Shell
        $wsh.SendKeys('{CAPSLOCK}')
        sleep 1
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wsh)| out-null
        Remove-Variable wsh
    }    
}

答案 1 :(得分:1)

add-type -Path '.\documents\WindowsPowerShell\VISE_WinKeyboardHook.dll'
$KeyboardInterceptor = new-object VISE.WinKeyboardHook.KeyboardInterceptor
function HandleKeyDown($keyId)
{
    write-host $keyID.KeyCode
    if($keyID.KeyCode -eq "Escape"){
        $KeyboardInterceptor.StopCapturing()
    }
}
Unregister-Event -SourceIdentifier KeyDown -ErrorAction SilentlyContinue
$keyevent = Register-ObjectEvent -InputObject $KeyboardInterceptor -EventName KeyDown -SourceIdentifier KeyDown -Action {HandleKeyDown($event.sourceEventArgs)}
$KeyboardInterceptor.StartCapturing()

这是一个C#程序集,它为全局键盘事件提供事件。 https://ianmorrish.wordpress.com/v-ise/keyboard-hook/ 这样做的好处是它不会阻塞,也适用于ISE。