ユーザーが誤って無限ループを引き起こしている可能性のあるスクリプト言語を実装しています。コマンド キーを押しながらピリオド (".") キーを入力することで、このような暴走ループをキャンセルする機会をユーザーに与えたいと考えています。
現在、行ごとに 1 回、次のコードでキャンセルを確認しています。
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 がデキューされる可能性があり、アプリケーションはキーが離されたことを認識できない可能性があります。
また、実際にキャンセル イベントであることがわかるまでイベントをデキューしたくありませんが、個別のデキュー呼び出しはなく、2 回目の呼び出しで最前面のイベントが同じものになると想定するだけでは信頼できません。また、それが最初であることが保証されている場合でも、それはユーザーが「a」を入力してから Cmd- を入力したことを意味します。つまり、「a」のみが表示され、Cmd- は表示されません。イベントをデキューしない場合はその背後にあります。
古い Carbon スタンバイ GetKeys() に行くよりも良いオプションはありますか? 幸いなことに、それは 64 ビットで利用できるようです。
また、スクリプトをキャンセルするボタンをメニューバーなどに追加する NSStatusItem を追加することも考えています。しかし、ユーザーがメニューを選択できないようにイベントを処理するにはどうすればよいでしょうか。
助言がありますか?おすすめは?