2011年2月8日火曜日

ユニバーサルアクセスの「補助装置にアクセスできるようにする」

xcatsan師匠が最近、Event MonitorというAPIについて触れている。システム全てのイベントを取得できる超便利なAPIらしい。

難点はユニバーサルアクセスの「補助装置にアクセスできるようにする」を有効にしないといけないこと、なんだそうで、師匠は次のように書いている。

とても強力な API だが、ユニバーサルアクセスの設定が必要なのと、何よりも悪用される可能性が高いことから使い道はかなり限られる。別の言い方をすると非常に簡単にキーロガーやイベントロガーの作成が可能なので、もし「補助装置にアクセスができるようにする」にチェックが入っていると簡単にそういったソフトの標的になりうる。この為、Global Event Monitor を使いこの設定を前提としたアプリケーションの配布は行うべきではないだろう(ユーザが一旦設定してしまうと悪意を持った他のアプリに容易にイベントを盗聴されてしまう可能性が高まる)。便利なんだが....残念。

なるほど、そういえば自分のiMacでも「補助装置云々」は有効にしていた覚えがあるので、さっそく無効にしてみた。なにが使えなくなるのか、と思ったらHyper Dockだった。がっかり。このアプリ、すごく便利なんだよなあ、ウィンドウの選択するのに。

致し方なく、Exposeの全ウィンドウ表示をマウスホイールのクリックに割り当ててなんとかしのいでいる。なんとかならないかなあ。

とにかくxcatsan師匠の教えの通りに、こんなふうに描いてみた。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
 // Insert code here to initialize your application 
 [NSEvent addGlobalMonitorForEventsMatchingMask:NSScrollWheelMask
             handler:^(NSEvent* event) {
           NSLog(@"GlobalMonitor: %@", event);
             }] 
}

で、ユニバーサルアクセスを可能にした状態で起動すると、マウスホイールの回転がどこで起きてもLOGがとれた。

2011-02-08 21:34:23.638 event_c[1193:a0f] GlobalMonitor: NSEvent: type=ScrollWheel loc=(2135,1122) time=8890.1 flags=0x100 win=0x0 winNum=11 ctxt=0x0 deltaX=0.000000 deltaY=-5.000000 deltaZ=0.000000 deltaX=0.000000 deltaY=-5.000000 deltaZ=0.000000 scrollPhase=None
2011-02-08 21:34:44.726 event_c[1193:a0f] GlobalMonitor: NSEvent: type=ScrollWheel loc=(931,1369) time=8911.2 flags=0x100 win=0x0 winNum=835 ctxt=0x0 deltaX=0.000000 deltaY=-5.000000 deltaZ=0.000000 deltaX=0.000000 deltaY=-5.000000 deltaZ=0.000000 scrollPhase=None

ちなみに最初のwinNum=11がデスクトップ上のころころの記録。
で、ユニバーサルアクセスを無効にして実行してみると・・・あれれ、師匠、スクロールホイールのイベント取れてますよ?(^^;)

ホイールのイベントだけはたいていのアプリが非アクティブ状態でも受け取れるので、きっと特殊なんでしょう。・・・お?ということは、どんな環境でもこのAPIがあればデスクトップ上のホイールイベントが取れる、ということか。おお、これは面白くなってきた。

[追記]デベロッパドキュメントを読んだら、

Key-related events may only be monitored if accessibility is enabled or if your application is trusted for accessibility access

ということでマウス関係ならユニバーサルアクセスを無効にしても受け取れるようだ。ふーむ。

0 件のコメント:

コメントを投稿