我有一个应用程序通过模拟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代码本身 - 我更需要一些保护措施,所以如果发生崩溃,它不会导致整个系统崩溃。所有这些重启都变得很烦人。
我正在从外部应用程序的聊天框中抓取文本。构建聊天框是为了禁止我使用辅助功能界面或任何其他方式。
我检查新文本的粘贴板文本。这是确保我不处理从其他应用程序复制的文本的快速方法。
循环不断发布事件以模拟用户输入,包括切换到聊天窗口,以及复制所选文本。如果在主线程上完成此操作,我的应用UI将暂停。我使用UI来显示正在发生的事情的概述。
后台线程使用NSNotifications将数据传递给主线程:
[self performSelectorOnMainThread:@selector(postNote:) withObject:d waitUntilDone:NO];
答案 0 :(得分:1)
一些想法: