2004-12-03

メニューを選んだ時点の ModifierFlags を得る方法

post : 2004-12-03 18:53 |

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