CGKeyEvent粘贴使用断点,但不是没有

时间:2011-06-04 20:16:12

标签: objective-c cocoa macos breakpoints

我在StackOverflow上搜索了很多关于这个主题的内容。到目前为止我发现的东西很有用。但现在,我找到了一个非常有趣的事实。

就我而言,我通过NSApp hide:self

隐藏了应用

然后我在粘贴板上添加一个字符,然后尝试通过CGEvents在最前面的应用程序中输入它。我的代码如下:

-(void)applicationDidHide:(NSNotification *)notification{
    stringToInsert = @"©";

    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
    [pasteboard clearContents];
    NSArray *copiedObjects = [NSArray arrayWithObject:stringToInsert];
    [pasteboard writeObjects:copiedObjects];

    //Use CGEvents to "press" Cmd-V
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef pasteCommandDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)9, YES);
    CGEventSetFlags(pasteCommandDown, kCGEventFlagMaskCommand);
    CGEventRef pasteCommandUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)9, NO);

    CGEventPost(kCGAnnotatedSessionEventTap, pasteCommandDown);
    CGEventPost(kCGAnnotatedSessionEventTap, pasteCommandUp);

    CFRelease(pasteCommandUp);
    CFRelease(pasteCommandDown);
    CFRelease(source);

}

我的问题是我在XCode 没有断点时运行它时不想插入文本。如果他的操作系统无法使用,那么它就会使得mac的特征变得“特别”。

但是 if 我为方法本身设置了一个断点,然后逐行跳转,好奇地在瞬间插入它。

抱歉我的英文不好以及我的文本格式可能不好,因为我是stackoverflow的新手。

如果你能提供帮助,我真的很感激!

1 个答案:

答案 0 :(得分:2)

我以前见过这个,我的猜测是事件发布得太快,系统无法处理(因为它实际上只需要处理不超过20个关键事件)。我猜想像usleep(100000)这样的东西(将线程暂停1/10秒)会有很大的帮助。