破坏OS X粘贴板

时间:2010-05-09 07:51:44

标签: objective-c cocoa macos pasteboard nspasteboard

我有一个应用程序通过模拟CMD-C复制命令和读取粘贴板来读取文本 - 不幸的是,这是实现我需要的唯一方法。偶尔,由于这是在开发中,偶尔我做错了(我不认为它与复制命令有关)并且应用程序崩溃。偶尔会对系统范围的粘贴板造成影响 - 如果我尝试复制,剪切或粘贴,任何正在运行的其他应用程序都会崩溃。

有没有一种强有力的方法来解决这个问题 - 在退出之前我应该​​在NSPasteboard上做些什么?任何有关可能发生的事情的信息都表示赞赏。

为了完整性,以下是访问粘贴板的唯一代码片段:

从粘贴板中读取:

NSString *pBoardText = [[NSPasteboard generalPasteboard]stringForType:NSStringPboardType];

最初清除粘贴板(我在发布时只运行一次):

[[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject:NSStringPboardType] owner: self];
    [[NSPasteboard generalPasteboard] setString: @"" forType: NSStringPboardType];
PS我忘记提到这个复制命令在一个循环上运行,在另一个线程中 - 可能很重要。虽然我一直小心不要在主线程上访问粘贴板而不先检查循环是否已停止。

更新 - 关于我在做什么的几个问题......

  • 您可以发布崩溃报告吗

现在正在努力 - 不幸的是,崩溃是不规则的。 让我说清楚 - 这是一个我仍在开发的应用程序,有时我会介绍一个bug。当这导致崩溃时,系统范围的粘贴板变得混乱了。看起来我的应用程序中的粘贴板访问不会导致崩溃,而是在背景循环处于与PB交互的微妙阶段时退出。 更新 - 重新崩溃报告 - 这对你们有多重要?我还在开发中,但是可以尝试在调试器中运行它几次,直到出现问题。不幸的是,我现在修复了所有出色的错误,并没有遇到任何崩溃。这强烈告诉我问题不在于PBoard代码本身 - 我更需要一些保护措施,所以如果发生崩溃,它不会导致整个系统崩溃。所有这些重启都变得很烦人。

  • 您能详细说明为什么需要模仿Cmd-C来做您需要的事吗?

我正在从外部应用程序的聊天框中抓取文本。构建聊天框是为了禁止我使用辅助功能界面或任何其他方式。

  • 为什么要在启动时清除剪贴板的内容?

我检查新文本的粘贴板文本。这是确保我不处理从其他应用程序复制的文本的快速方法。

  • 为什么要在线程上运行代码?

循环不断发布事件以模拟用户输入,包括切换到聊天窗口,以及复制所选文本。如果在主线程上完成此操作,我的应用UI将暂停。我使用UI来显示正在发生的事情的概述。

  • 请显示在主线程上运行的代码并检查循环并访问粘贴板

后台线程使用NSNotifications将数据传递给主线程:

[self performSelectorOnMainThread:@selector(postNote:) withObject:d waitUntilDone:NO];

1 个答案:

答案 0 :(得分:1)

一些想法:

  • 一个应用程序中的任何线程问题都不太可能会降低其他应用程序。由于这似乎是您的主要问题,因此问题似乎更可能是您在粘贴板上放置的数据或数据描述。当他们尝试使用粘贴板上的数据时,应用程序因某些原因而崩溃。
  • 您使用的代码仅适用于10.5或更早版本。 10.6中粘贴板的使用方式有几个主要变化。如果您的运行速度低于10.6,那么使用10.5方法可能是您的问题。
  • 10.6的一个主要变化是依赖UTI准确描述粘贴板上的数据。如果UTI不正确或出现乱码,任何试图根据数据使用数据的应用程序都可能会崩溃。
  • 如果您使用的是10.6,请确保使用Pasteboard Programming Guide作为参考,而不是旧的可可纸板编程主题。