我正在实现一种脚本语言,用户可能会意外导致无限循环。我想让用户有机会通过在键入句点(“。”)键的同时按住命令键来取消这种失控循环。
目前,每行一次,我使用以下代码检查取消:
NSEvent * evt = [[NSApplication sharedApplication] nextEventMatchingMask: NSKeyDownMask untilDate: [NSDate date] inMode: WILDScriptExecutionEventLoopMode dequeue: YES];
if( evt )
{
NSString * theKeys = [evt charactersIgnoringModifiers];
if( (evt.modifierFlags & NSCommandKeyMask) && theKeys.length > 0 && [theKeys characterAtIndex: 0] == '.' )
{
// +++ cancel script execution here.
}
}
这样做的问题是它会在脚本运行时吃掉用户可能正在键入的任何键盘事件,即使脚本应该能够检查按键。此外,它不会使相应的 NSKeyUp 事件出列。但是,如果我告诉它也将按键事件出列,它可能会将 keyUp 出列,以便在我的脚本开始之前持有的按键,并且我的应用程序可能永远不会发现按键已被释放。
另外,在我知道它实际上是一个取消事件之前,我不想让任何事件出队,但是没有单独的出队调用,并且仅仅假设第二次调用中最前面的事件将是同一个事件感觉不可靠。即使它保证是第一个,这也意味着用户输入一个'a'然后Cmd-。这意味着我只看到'a'而从来没有看到Cmd-。如果我不使事件出队,则在它后面。
有没有比使用旧的 Carbon 备用 GetKeys() 更好的选择?幸运的是,这似乎在 64 位中可用。
另外,我正在考虑添加一个 NSStatusItem 来添加一个按钮来取消脚本到菜单栏左右。但是我将如何以一种不允许用户选择菜单的方式处理事件,例如,当脚本期望成为主线程的统治者时?
有什么建议么?建议?