0

切入正题,然后:

第一个片段(AppDelegate):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    //...code taken out...

    [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *incomingEvent) {
        if ([incomingEvent type] == NSKeyDown) {
            NSUInteger flags = [incomingEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;
            if (flags==NSCommandKeyMask && ([incomingEvent keyCode] == 8)) {
                [ClipboardUtilities logger:@"cmd+c recognized"];
                [self determineAndAddToHistory];
            }
        }
    }];
}

第二个片段(AppDelegate):

-(void) determineAndAddToHistory {
    id clipDat = [ClipboardUtilities getClipboardDataNatively];
    if ([clipDat isKindOfClass:[NSAttributedString class]])
        NSLog(@"clipDat.string = %@",((NSAttributedString*)clipDat).string);
}

第三个片段(ClipboardUtilities 类):

+(id) getClipboardDataNatively {
    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
    NSArray *classArray = @[[NSAttributedString class], [NSImage class]];
    NSDictionary *options = [NSDictionary dictionary];

    NSArray *objectsToPaste = nil;
    BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options];
    if (ok) {
        objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options];
    }
        NSLog(@"objectsToPaste count = %li",[objectsToPaste count]);
    return [objectsToPaste objectAtIndex:0];
}

我注意到一些奇怪的行为,我将尝试用一个例子来解释:

输入

  1. Cmd+C 字符串“A”
  2. Cmd+C 字符串“B”
  3. Cmd+C 字符串“C”
  4. Cmd+C 字符串“D”

从确定AndAddToHistory 的输出

  1. 一个
  2. 一个
  3. C

所以我注意到它出于某种原因保留了第一个项目......然后每次都返回我第二个最近的项目。我尝试在 getClipboardDataNatively 方法中输出 objectsToPaste 数组,但仍然如此。有人可以让我知道我将如何解决这个问题,或者他们是如何解决的吗?

PS 我的 ClipboardUtilities 类没有实现任何委托,或者继承自 NSObject 以外的任何东西。

4

1 回答 1

0

好吧,我想既然没有人喜欢长问题(我必须弄清楚如何缩短这个问题),我想出了一些办法。出于某种原因,我很快就得到了热键调用(实际上调用键后剪贴板得到更新)。结果,我只是有一点延迟,我的模型现在已正确更新:

NSTimer* briefDelay = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(determineAndAddToHistory) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:briefDelay forMode:NSRunLoopCommonModes];

根据文档,我不会手动使计时器无效:

repeats
    If YES, the timer will repeatedly reschedule itself until invalidated. If NO, the timer will be invalidated after it fires.
于 2012-11-14T04:31:06.540 回答