ページ

2010年1月17日日曜日

今週のCocoa情報(1/17) - 今週気になった Cocoaプログラミング情報の紹介

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

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
同様の質問。