2004-12-03
メニューを選んだ時点の ModifierFlags を得る方法
NSMenuItem の action から飛んできた処理内で、押されているモデファイアキーを上手く取得できないという問題がある。[NSApp currentEvent] はメニューを開いた時点でのイベントを返すため最新の情報が取れない。どうもメニュートラッキングは Carbon でやってるみたいで、Cocoa の方まで情報が上がってこないのではないかと。
CarbonEventsCore.h に GetCurrentEventKeyModifiers() という関数があるのを発見。引数なしでただ呼ぶだけ。簡単だ。Mac OS X 10.2 以上で使える。ただし返り値は Carbon 用の値なので Cocoa で扱うには変換が必要。NSEvent にカテゴリを付けて実装する例を書いてみる。ビルドするには Carbon.framework をリンクする必要がある。
#import <Carbon/Carbon.h>
@implementation NSEvent(CarbonModFlag)
+ (unsigned int)currentCarbonModifierFlags
{
unsigned int cocoaModFlag=0;
UInt32 carbonModFlag=GetCurrentEventKeyModifiers(); if(carbonModFlag & cmdKey) cocoaModFlag|=NSCommandKeyMask;
if(carbonModFlag & optionKey) cocoaModFlag|=NSAlternateKeyMask;
if(carbonModFlag & shiftKey) cocoaModFlag|=NSShiftKeyMask;
if(carbonModFlag & controlKey) cocoaModFlag|=NSControlKeyMask;
return cocoaModFlag;
}
@end
SafariStand で試したところ、最新の状態を取得することができた。ブックマークバーが使いやすくなるだろう。
Trackback 現在、受付は中止しています
No Trackbacks
Comment
No Comments