사용자가 우연히 무한 루프를 일으킬 수있는 스크립팅 언어를 구현하고 있습니다. 나는 마침표 (".") 키를 입력하는 동안 명령 키를 누른 채로 이러한 가출 고리를 취소 할 수있는 기회를 사용자에게 제공하려고합니다.좁은 루프에서 Command-Period를 확인하는 방법은 무엇입니까?
현재는 한 번에 모든 행에 대해,이 코드로 취소 확인 :
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 이벤트를 dequeue하지 않습니다. 그러나 키 업 이벤트도 큐에서 제거하도록 지시하면 스크립트가 시작되기 전에 대기중인 키 누르기에 대해 keyUp을 큐에서 꺼낼 수 있습니다. 따라서 응용 프로그램에서 키가 릴리스되었음을 결코 알지 못할 수도 있습니다.
또한 실제로 취소 이벤트 인 것을 알기 전까지는 어떤 이벤트도 대기열에서 제외하지 않으려합니다.하지만 별도의 대기열 해제 호출은 없으며 두 번째 호출에서 맨 앞의 이벤트가 동일하다고 가정하는 것이 신뢰할 수 없다고 느낍니다. 하나. 그리고 그것이 첫 번째로 보장된다고하더라도, 그것은 사용자가 'a'를 입력 한 다음 Cmd-를 입력한다는 것을 의미합니다. 나는 'a'만보고 Cmd는 절대 볼 수 없다는 것을 의미합니다. 내가 이벤트를 큐에서 꺼내지 않으면 그 뒤에.
이전의 Carbon 대기 모드 인 GetKeys()보다 더 좋은 옵션이 있습니까? 다행히도 64 비트에서 사용할 수있는 것 같습니다.
또한 메뉴 막대에 스크립트를 취소하는 버튼을 추가하는 NSStatusItem을 추가하려고합니다. 하지만 어떻게하면 사용자를 허용하지 않는 방식으로 이벤트를 처리 할 수 있습니까? 스크립트가 주 스레드의 룰러가 될 것으로 기대하면서 메뉴를 선택합니까?
제안 사항? 추천?
슬프게도, 작동하지 않습니다 (방금 로컬 모니터를 시도했습니다). 귀하의 제안에 따라 실제로 이벤트를 큐에서 빼고 -sendEvent :를 통해 디스패치해야합니다. 하지만 그것은 스크립트가 실행되는 동안 사용자가 텍스트 필드 등을 입력 할 수 있다는 것을 의미합니다. 이는 내가 원하지 않는 것입니다. – uliwitness
@uliwitness 나는 당신이 원하는 것을 이해하지 못한다고 생각합니다. '-sendEvent :'를 통해 이벤트가 전달되는 것을 막으려면 블록에서'nil'을 리턴하십시오. –
스크립트를 실행 중입니다. 이러한 스크립트는 이벤트 대기열을 보거나 키 누르기를 처리하는 것을 포함하여 다른 프로그래밍 언어에서 수행 할 수있는 모든 작업을 수행 할 수 있습니다. 그렇지 않을 수도 있습니다. 스크립트 실행을 취소 할 수 있기를 원하지만 누군가가 실제로 취소하지 않는 한 정당한 키 이벤트를 스크립트에서 제외시키지 않으려합니다. AppKit은 sendEvent 내부에서 모니터를 실행하는 것처럼 보이므로 모니터 할 수있는 이벤트를 보내야합니다. 즉, 스크립트가 대기열의 이벤트를 더 이상 볼 수 없게됩니다. – uliwitness