ご挨拶。 私は子供の制御アプリケーションを作ろうとします。キーボードロガーはこのアプリケーションの一部です。 私は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;
}
あなたのアプリケーションには、ユーザーが対話するグラフィカルインターフェイスがありますか? – Chuck
はい、それはココアです。しかし、Dockに独自のアイコンがありません(エージェントアプリケーション) – Dmytro
これで回避策があります - 複製イベントが0.2秒より速くなるかどうかを確認します。 – Dmytro