使用 Powershell 监听按键,但不要等待

2023-12-22

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

到目前为止我的脚本是

: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 后,脚本将切换一次大写锁定,然后退出。如果我在“删除变量”之后删除条件,脚本将按照我希望的方式运行,除非它可以停止的唯一方法是关闭控制台窗口。


这是一个尝试。顺便说一句,我将睡眠时间更改为 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
    }    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Powershell 监听按键,但不要等待 的相关文章

随机推荐