How to monitor global modifier key state (in any application)? - Stack Overflow
アプリが非アクティブの時でもキーイベントを拾う方法について。Quartz Event や Carbon(ホットキー)などが紹介されていた。
Quartz Event は低いレベルでのイベントを扱うことができるようだ。
Mac Dev Center: Quartz Event Services Reference
試しに次のコードを実行してみたところ他のアプリのマウスクリックを拾う事ができた。
CGEventRef eventTapCallback (CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { NSLog(@"event: %d", type); return event; } -(void)awakeFromNib { CFMachPortRef eventTap = CGEventTapCreate( kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, CGEventMaskBit(kCGEventLeftMouseDown) | CGEventMaskBit(kCGEventLeftMouseUp), &eventTapCallback, self); CFRunLoopSourceRef runLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, eventTap, 0); CFRelease(eventTap); CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSourceRef, kCFRunLoopDefaultMode); CFRelease(runLoopSourceRef); } @end
ただイベントマスクに kCGEventKeyUp/Down を指定すると EXC_BAD_ACCESS が出て落ちてしまった。どうもキーイベントを扱うには条件があるようだ。
Trouble with event taps... | Cocoabuilder
上記によれば、次のいづれかの条件を満たす必要があるとのこと。
- rootユーザで実行している
- "Access for assistive devices"(ユニバーサルアクセスの「補助装置にアクセスできる」オプション)が有効になっている
確かに無条件ではセキュリティ上問題がある(キーロガーが簡単に作れそうなので)。
他、情報:
Receiving, Filtering, and Modifying Key Presses and Releases
monkey coders' - Xcode Debugging Tips
monkey coders' - Guard Malloc(libgmalloc) について
デバッガの使い方など(日本語)。
MGTemplateEngine – Templates with Cocoa » Matt Legend Gemmell
cocoaネイティブなテンプレートエンジン。
利用例はこんな感じ。(http://mattgemmell.com/files/sample_template.txt より)
It's currently {% now | date_format: "dd MMM yyyy 'at' HH:mm:ss" %} Nested variable: {{ foo.bar }} {% for dude in guys %} Current dude is {{ dude | uppercase }}... {% if currentLoop.currentIndex == 0 %} (the best!) {% comment %} Should only happen for Matt {% /comment %} {% for 1 to 5 %}*{% /for %} {% /if %} {%/for%} Last of the {{ guys.@count }} guys was {{ guys.@lastObject | capitalized }}
Webサービス用のXMLを生成するのに使えそうだ。Delegate, KVC に対応しているところが面白い。
What's the Best Way to Shuffle an NSMutableArray? - Stack Overflow
NSMutableArray をシャッフルするには?
exchangeObjectAtIndex:withObjectAtIndex: を使ったコードが紹介されていた。
How to sort randomly with CoreData - Stack Overflow
同様の質問。