【问题标题】:Detect Keypress and Delay Until Key Released AppleScript检测按键并延迟直到按键释放 AppleScript
【发布时间】:2017-06-02 19:56:37
【问题描述】:

我无法弄清楚如何检测 AppleScript 中按下的键以及如何延迟直到该键被释放。我想为缩放做一个切换,我拥有其他一切(我认为)。这是我当前的代码

on idle
    set ztoggle to 0

    repeat

        --how do i make it so a key is needed to run this loop? maybe an 'if (im not sure what to put here) then' loop?--
            if (ztoggle = 1) then
                set ztoggle to 0
            else if (ztoggle = 0) then
                set ztoggle to 1
            end if
        --how do i make it so the program waits at this line until the key from before is released? i was thinking delay, but im not sure--


        if (ztoggle = 1) then
            tell application "System Events"
                key code 28 using {option down, command down}
            end tell
        end if

        set ztoggle to 0

    end repeat
end idle

有人知道我会怎么做吗?另外,这是我第一次尝试使用 AppleScript,所以如果我在其他地方搞砸了,请告诉我。

【问题讨论】:

    标签: applescript keypress


    【解决方案1】:

    这可以在没有任何第三方添加的情况下完成,而是调用可可框架:

    use framework "Cocoa"
    use scripting additions
    
    global ca
    set ca to current application
    
    to isModifierPressed(modifier)
        ((ca's NSEvent's modifierFlags()) / modifier as integer) mod 2 is equal to 1
    end isModifierPressed
    
    repeat until isModifierPressed(ca's NSEventModifierFlagControl)
        delay 0.1 -- sad poll/wait loop :(
    end repeat
    display dialog "Control was pressed"
    

    注意NSEvent's modifierFlags() 是一个位域,NSEventModifierFlagControl 是一个 2n 位标志,它们需要按位与在一起,以查看是否保留了密钥。 AppleScript 没有按位运算符 (!!),因此在这种情况下,AND 以算术方式模拟 - 首先将 modifierFlags() 位域除以 NSEventModifierFlagControl 位标志的整数,然后查看结果是否为奇数。

    modifierFlags() 只报告瞬时修饰符状态,所以我们必须循环轮询它以等待按键。

    Other modifier keys 也可以这样检查。它们是:

    Syntax Description
    NSEventModifierFlagCapsLock The Caps Lock key has been pressed.
    NSEventModifierFlagShift The Shift key has been pressed.
    NSEventModifierFlagControl The Control key has been pressed.
    NSEventModifierFlagOption The Option or Alt key has been pressed.
    NSEventModifierFlagCommand The Command key has been pressed.
    NSEventModifierFlagNumericPad A key in the numeric keypad or an arrow key has been pressed.
    NSEventModifierFlagHelp The Help key has been pressed.
    NSEventModifierFlagFunction A function key has been pressed.
    NSEventModifierFlagDeviceIndependentFlagsMask Device-independent modifier flags are masked.

    【讨论】:

      【解决方案2】:

      这对于(“vanilla”)AppleScript 是不可能的。唯一接近它的是使用第三方命令行二进制“checkModifierKeys”(https://github.com/reggiezhang/checkModifierKeys)检查修改键是否被按下[编辑:新 url - 谢谢,@jerry-t]。

      你必须使用类似的东西

      do shell script "/usr/local/bin/checkModifierKeys control"
      

      在重复循环中。效果不错。

      【讨论】:

      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2012-07-18
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      相关资源
      最近更新 更多