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];