【问题标题】:(OS X) Prevent keyobard during programmatic mouse click(OS X) 在程序化鼠标单击期间防止键盘出现
【发布时间】:2014-08-30 13:47:47
【问题描述】:

我正在尝试将 keynav 移植到 OS X。它基本上可以工作,但由于无法更改(全局)监控事件,我遇到了问题。

是否可以在鼠标单击事件期间抑制键盘修饰符?也许使用序列,例如使用“控制键向上”+鼠标单击创建键盘事件?

这是我的鼠标点击方法:

- (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);
}

【问题讨论】:

  • 我找到了解决方案。从这里修改代码:gist.github.com/boratlibre/8313195 稍后我会为我的问题添加答案。 navkey 现在工作正常。也许我会把它添加到github。

标签: macos nsevent


【解决方案1】:

所以这就是我最终的结果。特别是这里所做的背景:当按下 ctrl+comma 时,keynav 覆盖到整个桌面,用户可以使用按住 ctrl+SomeKeys 来导航十字准线,并通过 a 模拟在十字准线位置单击鼠标第二个 ctrl+逗号(在下面的代码 sn-p 中等待第二次单击时设置了 awaitClick)。

现在,在单击完成之前,控制键修饰符已从键盘事件中移除。此外,在显示 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2012-08-01
    • 1970-01-01
    • 2019-06-13
    • 2023-03-20
    • 2021-09-10
    • 2020-04-22
    相关资源
    最近更新 更多