Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 当我的应用程序不是前端应用程序时,如何向它发送键盘事件?_Macos_Cocoa - Fatal编程技术网

Macos 当我的应用程序不是前端应用程序时,如何向它发送键盘事件?

Macos 当我的应用程序不是前端应用程序时,如何向它发送键盘事件?,macos,cocoa,Macos,Cocoa,我希望我的应用程序在某个键盘事件发生时收到通知(例如,在不到0.5秒内左alt键按下两次)。应用程序不应该是前端应用程序。如何执行此操作?您需要安装一个事件点击以更改修改器键 这应该让你开始: - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { CFMachPortRef eventTap; CGEventMask eventMask; CFRunLoopSourceRef run

我希望我的应用程序在某个键盘事件发生时收到通知(例如,在不到0.5秒内左alt键按下两次)。应用程序不应该是前端应用程序。如何执行此操作?

您需要安装一个事件点击以更改修改器键

这应该让你开始:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    CFMachPortRef eventTap;
    CGEventMask eventMask;
    CFRunLoopSourceRef runLoopSource;

    eventMask = CGEventMaskBit(kCGEventFlagsChanged);

    eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0,
                                eventMask, KeyHandler, NULL);
    if (!eventTap) {
        NSLog(@"failed to create event tap");
        exit(1);
    }

    runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);    
    CGEventTapEnable(eventTap, true);
}

static CGEventFlags previousFlags = 0;

CGEventRef KeyHandler(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    if (type == kCGEventFlagsChanged) {
        CGEventFlags curAltkey = CGEventGetFlags(event)&kCGEventFlagMaskAlternate;
        if (curAltkey != previousFlags)
            NSLog(@"alt key changed");
    }

    return event;
}

@上面的代码片段只点击“标志更改”事件——它与鼠标事件无关。正如您所看到的,所有事件都是未经更改地返回的--我认为您的鼠标事件肯定发生了其他问题。抱歉,我看到我从复制此事件的某些代码中漏掉了一个“剩余”——您应该删除
CFRunLoopRun()语句。已更新答案以删除此选项。