我有一个应用程序,它可以通过模拟CMD-C复制命令并读取粘贴板来读取文本-不幸的是,这是实现所需功能的唯一方法。有时,由于这是正在开发中,因此有时我会做错事情(我认为这与copy命令无关),并且应用程序崩溃。有时,这会对整个系统的粘贴板产生影响-如果我尝试复制,剪切或粘贴,正在运行的任何其他应用程序都将崩溃。
是否有健壮的方法来处理此问题-退出前我应该使用NSPasteboard做些什么?任何有关可能发生的事情的信息,不胜感激。
为了完整起见,以下是访问粘贴板的唯一代码段:
从粘贴板读取:
NSString *pBoardText = [[NSPasteboard generalPasteboard]stringForType:NSStringPboardType];
最初清除粘贴板(我在启动时仅运行一次):
[[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject:NSStringPboardType] owner: self];
[[NSPasteboard generalPasteboard] setString: @"" forType: NSStringPboardType];
PS我忘了提及此复制命令在另一个线程中的循环上运行-可能很重要。尽管我一直很小心,在未先检查循环是否已停止的情况下,不要访问主线程上的粘贴板。
更新-有关我在做什么的几个问题...
您可以发布崩溃报告吗
立即进行操作-不幸的是,崩溃是不定期的。
不过,请让我清楚-这是我仍在开发的应用程序,有时会引入一个错误。当这导致崩溃时,系统范围的粘贴板有时会弄乱。我的应用程序中的剪贴板访问似乎并没有引起崩溃,而是在后台循环处于与PB交互的微妙阶段时退出了。
更新-重新提交崩溃报告-这对你们有多重要?我仍在开发中,但是可以尝试在调试器中运行几次,直到出现问题为止。不幸的是,我暂时修复了所有未解决的错误,并且没有崩溃。这向我强烈暗示,问题不在于PBoard代码本身,而是我在寻找一些保护措施,以便在发生崩溃时不会崩溃整个系统。所有这些重新启动变得烦人。
您能否详细说明为什么需要模仿Cmd-C来完成所需的工作?
我正在从外部应用程序上的聊天框中抓取文本。建立聊天框是为了禁止我使用“辅助功能”界面或任何其他方式。
为什么在启动时清除剪贴板中的内容?
我检查了粘贴板文本中是否有新文本。这是确保我不处理从其他应用程序复制的文本的快速方法。
为什么要在线程上运行代码?
该循环会连续发布事件以模拟用户输入,包括切换到聊天窗口和复制所选文本。如果在主线程上完成此操作,则我的应用程序UI会挂起。我使用UI来显示正在发生的事情的概述。
请显示在主线程上运行的代码,并检查循环并访问粘贴板
后台线程使用NSNotifications将数据传递到主线程:
[self performSelectorOnMainThread:@selector(postNote:) withObject:d waitUntilDone:NO];
最佳答案
一些想法:
一个应用程序中的任何线程问题都极有可能导致其他应用程序瘫痪。由于这似乎是您的主要问题,因此问题很可能与您放置在粘贴板上的数据或数据描述有关。当应用尝试使用粘贴板上的数据时,它们由于某种原因而崩溃。
您使用的代码仅适用于10.5或更早版本。 10.6中使用粘贴板的方式发生了几处重大变化。如果您在10.6下运行,则使用10.5方法可能是您的问题。
10.6的一项主要更改是对UTI的依赖,以准确地描述粘贴板上的数据。如果UTI不正确或出现乱码,则任何基于数据的假设尝试使用数据的应用程序都可能崩溃。
如果您使用的是10.6,请确保使用Pasteboard Programming Guide作为参考,而不是使用较早的可可粉彩纸板编程主题。