0

我正在尝试模拟键盘输入 Ctrl + Up 以打开任务控制,并在此处引用了代码:

https://stackoverflow.com/a/10745616/8556692

#import <Cocoa/Cocoa.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"Open Mission Control");
        CGEventSourceRef src =
          CGEventSourceCreate(kCGEventSourceStateHIDSystemState);

        CGEventRef ctrld = CGEventCreateKeyboardEvent(src, 0x3B, true);
        CGEventRef ctrlu = CGEventCreateKeyboardEvent(src, 0x3B, false);
        CGEventRef upd = CGEventCreateKeyboardEvent(src, 0x7E, true);
        CGEventRef upu = CGEventCreateKeyboardEvent(src, 0x7E, false);

        CGEventSetFlags(upd, kCGEventFlagMaskControl);
        CGEventSetFlags(upu, kCGEventFlagMaskControl);

        CGEventTapLocation loc = kCGHIDEventTap; // kCGSessionEventTap also works
        CGEventPost(loc, ctrld);
        CGEventPost(loc, upd);
        usleep(20000);
        CGEventPost(loc, upu);
        CGEventPost(loc, ctrlu);

        CFRelease(ctrld);
        CFRelease(ctrlu);
        CFRelease(upd);
        CFRelease(upu);
        CFRelease(src);
    }
    NSLog(@"Done");
    return 0;//NSApplicationMain(argc, argv);
}

但是失败了。

我尝试用这段代码模拟Cmd+Space(0x38 + 0x31 + Command Mask),成功了一次,我想我的代码一定有问题......

4

2 回答 2

1

我也遇到了这个问题。除 kCGEventFlagMaskControl 之外的所有标志(kCGEventFlagMaskCommand、kCGEventFlagMaskShift)都有效。我添加了此处所写的 kCGEventFlagMaskSecondaryFn模拟键盘命令在操作系统升级后不起作用,现在可以使用。

CGEventSetFlags(upd, kCGEventFlagMaskControl | kCGEventFlagMaskSecondaryFn);
CGEventSetFlags(upu, kCGEventFlagMaskControl | kCGEventFlagMaskSecondaryFn);
于 2020-07-14T11:47:34.407 回答
0

啊,我已经明白了,开放式任务控制没有那么复杂,std::system("open /System/Applications/Mission\\ Control.app");就够了。

但仍然很难理解为什么 ctrl+up 为什么不起作用

于 2020-05-19T03:03:42.283 回答