2

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

有没有一种强大的方法来处理这个问题 - 我应该在退出之前对 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];
4

1 回答 1

1

一些想法:

  • 一个应用程序中的任何线程问题都不太可能导致 其他应用程序瘫痪。由于这似乎是您的主要问题,因此问题似乎更可能出在您放在粘贴板上的数据或数据描述上。应用程序在尝试使用粘贴板上的数据时由于某种原因崩溃。
  • 您使用的代码仅适用于 10.5 或更早版本。10.6 中粘贴板的使用方式发生了几处重大变化。如果您在 10.6 下运行,则使用 10.5 方法可能是您的问题。
  • 10.6 的一个主要变化是依赖 UTI 来准确描述粘贴板上的数据。如果 UTI 不正确或出现乱码,任何应用程序试图基于数据是其他数据的假设来使用数据都可能崩溃。
  • 如果您使用的是 10.6,请确保使用粘贴板编程指南作为参考,而不是旧的可可粘贴板编程主题。
于 2010-05-16T19:44:44.450 回答