2010-12-29 7 views
6

ご挨拶。 私は子供の制御アプリケーションを作ろうとします。キーボードロガーはこのアプリケーションの一部です。 私はCGEventTapCreateを使ってキーボードを見ます。これはうまくいくが、キーダウンイベントが重複することがある。彼らは[NSEvent isARepeat]が設定されておらず、重複しています。たとえば、「qwerty」と入力できますが、アプリケーションはこれらの文字のキーダウンイベント「qqwweerrttyy」を取得します。たぶん、誰かがそれを好きかもしれませんか?私は10.5 & 10.6(どちらもIntelです)でこの問題が発生します。CGEventTapCreateがココアのキーボード入力を見ています

私は、キーボードロガーは、&ハンドラメソッドインストールここに投稿:あなたの最初のCGEventTapCreateが成功した場合、あなたはまだキー+マウスで別のものを作成

- (BOOL)installKeyboardLogger 
{ 
    CGEventMask keyboardMask = CGEventMaskBit(kCGEventKeyDown); 
    CGEventMask mouseMask = CGEventMaskBit(kCGEventMouseMoved) | CGEventMaskBit(kCGEventLeftMouseDown) | 
     CGEventMaskBit(kCGEventRightMouseDown); 

    CGEventMask mask = keyboardMask + mouseMask;// + mouseMask;//CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventMouseMoved); 

    // Try to create keyboard-only hook. It will fail if Assistive Devices are not set. 
    mMachPortRef = CGEventTapCreate(
            kCGAnnotatedSessionEventTap, 
            kCGTailAppendEventTap, // kCGHeadInsertEventTap 
            kCGEventTapOptionListenOnly, 
            keyboardMask, 
            (CGEventTapCallBack)eventTapFunction, 
            self); 
    if (!mMachPortRef) 
    [mLogFile logNeedAssistiveDevice: @"Can't install keyboard hook."]; 
    else 
    CFRelease(mMachPortRef); 

    mMachPortRef = CGEventTapCreate(
            kCGAnnotatedSessionEventTap, 
            kCGTailAppendEventTap, // kCGHeadInsertEventTap 
            kCGEventTapOptionListenOnly, 
            mask, 
            (CGEventTapCallBack)eventTapFunction, 
            self); 
    if (!mMachPortRef) 
    { 
    [mLogFile logNeedAssistiveDevice: @"Can't install keyboard&mouse hook."]; 
    return NO; 
    } 

    mKeyboardEventSrc = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mMachPortRef, 0); 
    if (!mKeyboardEventSrc) 
    return NO; 

    CFRunLoopRef runLoop = CFRunLoopGetCurrent(); 
    if (!runLoop) 
    return NO; 

    CFRunLoopAddSource(runLoop, mKeyboardEventSrc, kCFRunLoopDefaultMode); 
    return YES; 
} 


    CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) 
{ 
    if (type != NX_KEYDOWN && type != NX_OMOUSEDOWN && type != NX_OMOUSEUP && type != NX_OMOUSEDRAGGED && 
     type != NX_LMOUSEUP && type != NX_LMOUSEDOWN && type != NX_RMOUSEUP && type != NX_RMOUSEDOWN && 
     type != NX_MOUSEMOVED && type != NX_LMOUSEDRAGGED && type != NX_RMOUSEDRAGGED) 
    return event; 

    NSEvent* sysEvent = [NSEvent eventWithCGEvent:event]; 

    if (type == NX_KEYDOWN && [sysEvent type] == NSKeyDown) 
    { 
    if (![sysEvent isARepeat]) 
     [(ControlPanelController*)refcon handleCapturedCharacters: [sysEvent characters]]; 
    } 
    else 
    [(ControlPanelController*)refcon handleMouse]; 

    return event; 
} 
+0

あなたのアプリケーションには、ユーザーが対話するグラフィカルインターフェイスがありますか? – Chuck

+0

はい、それはココアです。しかし、Dockに独自のアイコンがありません(エージェントアプリケーション) – Dmytro

+0

これで回避策があります - 複製イベントが0.2秒より速くなるかどうかを確認します。 – Dmytro

答えて

0

。それがキーダウンイベントを重複して取得するのはなぜですか?

+0

ああ、ちょうどタイムスタンプを見た...まあ私はあなたが今それを修正:) – tadelv

関連する問題