如何使用AppKit从AppleScript中的NSEvent中获取关键代码或关键文本



我希望能够从NSEvent/KeyEvent获得关键代码或字符/文本。我完全不知道如何做到这一点,因为到目前为止我发现的文档非常有限。

我的脚本如下。我正在为Minecraft制作一个speedrun宏。

这个脚本的功能是完全一样的,但目前它所做的只是通过检查NSEvent的修饰符标志来检查控制键是否被按下。

use framework "AppKit"
use scripting additions
global ca
set ca to current application
# you may change the following variables
global seed
set seed to "8398967436125155523"
to isModifierPressed(modifier)
((ca's NSEvent's modifierFlags()) / modifier as integer) mod 2 is equal to 1
end isModifierPressed
repeat
if isModifierPressed(ca's NSEventModifierFlagControl) then execute()
delay 0.01
end repeat
on execute()
tell application "System Events"
delay 0.1
keystroke tab
delay 0.02
keystroke return
delay 0.02
repeat 3 times
keystroke tab
delay 0.02
end repeat
keystroke return
delay 0.02
repeat 2 times
keystroke tab
delay 0.02
end repeat
repeat 3 times
keystroke return
delay 0.02
end repeat
repeat 4 times
keystroke tab
delay 0.02
end repeat
keystroke return
delay 0.02
repeat 3 times
keystroke tab
delay 0.02
end repeat
keystroke seed
delay 0.02
repeat 6 times
keystroke tab
delay 0.02
end repeat
keystroke return
end tell
end execute

获取密钥代码有点困难。我写了Objective-C代码来处理这个StackOverflow答案;基本上,它使用NSEvent创建一个包含所有可能的键修饰符组合的字典,以便从给定的类型化字符向后引用。有点小题大做,但你可能会发现学习它是有帮助的。

当然,如果你已经有了NSEvent对象,那么你可以使用下面的命令来获取基本信息:

NSEvent's characters()
NSEvent's charactersIgnoringModifiers()
NSEVent's modifierFlags()
NSEvent's keyCode()

您可以为特定的键代码创建一个NSEvent,如下所示:

use framework "AppKit"
use scripting additions
set ca to current application
set codeForGeneration to 40
set modFlags to 0
set keyEvent to ca's NSEvent's keyEventWithType:(ca's NSKeyDown) ¬
location:(ca's NSMakePoint(1, 1)) ¬
modifierFlags:0 ¬
timestamp:0 ¬
windowNumber:0 ¬
context:(missing value) ¬
|characters|:(missing value) ¬
charactersIgnoringModifiers:(missing value) ¬
isARepeat:false ¬
keyCode:codeForGeneration
set outputCharacter to (keyEvent's charactersByApplyingModifiers:modFlags) as string

第6行(set keyEvent to...)创建一个键事件。你只需要关心自己的第一个和最后两个选项:keydown/keyup, repeat, keyCode。除非您想尝试向特定窗口或GUI元素发送键事件,否则其他选项都是虚拟的。第7行(set outputCharacter to...)从事件中提取字符。这将产生一个小的'k',因为40是'k'的关键代码,并且没有使用修饰符。

修饰符使用起来有点烦人。你可以单独使用ObjC常量(例如,ca's NSEventModifierFlagShiftca's NSEventModifierFlagOption),但要将它们组合起来,你必须认识到标志是根据二进制左移来定义的:例如,NSEventModifierFlagShift被定义为1 <<17和nsevenmodifierflagoption为1 <<19,表示1位分别左移17位或19位。因此,要创建一个shift-option-K事件(苹果标志),你必须将modFlags设置为2^17+2^19。

相关内容

  • 没有找到相关文章

最新更新