检测Keypress并延迟直到Key发布AppleScript

时间:2017-06-02 19:56:38

标签: applescript keypress

我无法弄清楚如何检测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,所以如果我搞砸了其他地方,请告诉我。

2 个答案:

答案 0 :(得分:0)

使用(" vanilla")AppleScript是不可能的。接近它的唯一方法是使用第三方命令行二进制文件检查是否按下了一个修饰符键" checkModifierKeys" (https://bitbucket.org/anddam/checkmodifierkeys/downloads/?tab=downloads)。

您必须使用类似

的内容
do shell script "/usr/local/bin/checkModifierKeys control"

在重复循环中。它运作良好。

答案 1 :(得分:0)

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

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 也可以通过这种方式检查。它们是:

<头>
语法 说明
NSEventModifierFlagCapsLock Caps Lock 键已被按下。
NSEventModifierFlagShift Shift 键已被按下。
NSEventModifierFlagControl 已按下 Control 键。
NSEventModifierFlagOption Option 或 Alt 键已被按下。
NSEventModifierFlagCommand Command 键已被按下。
NSEventModifierFlagNumericPad 数字小键盘中的某个键或箭头键被按下。
NSEventModifierFlagHelp 帮助键已被按下。
NSEventModifierFlagFunction 已按下功能键。
NSEventModifierFlagDeviceIndependentFlagsMask 与设备无关的修饰符标志被屏蔽。