Macos (OS X)在编程鼠标单击期间防止键盘
我正在尝试将keynav移植到OSX。它基本上可以工作,但由于无法更改全局监视的事件,我面临一个问题 是否可以在鼠标单击事件期间抑制键盘修改器?可能使用一个序列,例如使用控制键向上+鼠标单击创建键盘事件 这是我的鼠标点击方法:Macos (OS X)在编程鼠标单击期间防止键盘,macos,nsevent,Macos,Nsevent,我正在尝试将keynav移植到OSX。它基本上可以工作,但由于无法更改全局监视的事件,我面临一个问题 是否可以在鼠标单击事件期间抑制键盘修改器?可能使用一个序列,例如使用控制键向上+鼠标单击创建键盘事件 这是我的鼠标点击方法: - (void)clickMouseAtPoint:(CGPoint)point { CGEventRef move = CGEventCreateMouseEvent(
- (void)clickMouseAtPoint:(CGPoint)point
{
CGEventRef move = CGEventCreateMouseEvent(
NULL, kCGEventMouseMoved,
point,
kCGMouseButtonLeft // ignored
);
CGEventRef click1_down = CGEventCreateMouseEvent(
NULL, kCGEventLeftMouseDown,
point,
kCGMouseButtonLeft
);
CGEventRef click1_up = CGEventCreateMouseEvent(
NULL, kCGEventLeftMouseUp,
point,
kCGMouseButtonLeft
);
CGEventPost(kCGHIDEventTap, move);
CGEventPost(kCGHIDEventTap, click1_down);
CGEventPost(kCGHIDEventTap, click1_up);
CFRelease(click1_up);
CFRelease(click1_down);
CFRelease(move1);
}
这就是我的结局。这里所做工作的背景:当按下ctrl+comma时,键盘导航覆盖在整个桌面上,用户可以使用按住ctrl+SomeKeys来导航十字线,并通过在下面的代码段中等待第二次单击时设置第二次ctrl+comma WaitClick来模拟鼠标在十字线位置的单击 现在,在单击完成之前,控制键修改器将从键盘事件中删除。此外,当显示keynav时,所有键盘输入都与keycode-1交换。我通过实验发现这会抑制按键 如果这是一个好方法或不是,我不知道。但到目前为止,它工作可靠
CGEventRef
myCGEventCallback(CGEventTapProxy proxy, CGEventType type,
CGEventRef event, void *refcon)
{
if ((type != kCGEventKeyDown) && (type != kCGEventKeyUp))
return event;
CGKeyCode keycode = (CGKeyCode)CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
EWAppDelegate *appInstance = [NSApplication sharedApplication].delegate;
CGEventFlags flags = CGEventGetFlags(event);
if (_awaitClick && keycode == (CGKeyCode)43 && type == kCGEventKeyDown)
{
flags = flags & ~kCGEventFlagMaskControl;
CGEventSetFlags(event, flags);
NSLog(@"suppressed control key");
}
BOOL didHandle = NO;
if (type == kCGEventKeyDown)
{
didHandle = [appInstance handleNavKey:keycode flags:flags];
}
NSLog(@"pressed keycode %d", keycode);
if (didHandle || _navIsSHowing) {
CGEventSetIntegerValueField(event, kCGKeyboardEventKeycode, (int64_t)-1);
NSLog(@"nav");
}
return event;
}
- (BOOL)registerGlobalKeyBoardModifier
{
CFMachPortRef eventTap;
CGEventMask eventMask;
CFRunLoopSourceRef runLoopSource;
eventMask = ((1 << kCGEventKeyDown) | (1 << kCGEventKeyUp));
eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0,
eventMask, myCGEventCallback, NULL);
if (!eventTap) {
fprintf(stderr, "failed to create event tap\n");
return NO;
}
runLoopSource = CFMachPortCreateRunLoopSource(
kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource,
kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
return YES;
}
我找到了解决办法。从此处修改代码:稍后我将添加问题的答案。导航键现在可以正常工作了。也许我会把它加入github。