【发布时间】:2013-04-22 06:04:56
【问题描述】:
我正在实现一种脚本语言,用户可能会在其中意外导致无限循环。我想让用户有机会通过在键入句点(“.”)键的同时按住命令键来取消这种失控循环。
目前,每行一次,我使用以下代码检查是否取消:
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,它添加一个按钮来取消脚本到菜单栏左右。但是我将如何以不允许用户的方式处理事件,例如在脚本期望成为主线程的标尺时选择菜单?
有什么建议吗?推荐?
【问题讨论】: