ユーザーが任意のアプリケーションで行ったすべてのテキスト選択を監視したいと思います。それは可能ですか?.netのソリューションをお勧めしますが、バニラC++で問題ありません。
そうでない場合、.netアプリケーションからすべてのテキストコピー操作(CTRL + C)を監視できますか?
同様の質問:C#で、現在フォーカスされているウィンドウの選択されたテキストコンテンツを一貫して取得できる方法はありますか?
ユーザーが任意のアプリケーションで行ったすべてのテキスト選択を監視したいと思います。それは可能ですか?.netのソリューションをお勧めしますが、バニラC++で問題ありません。
そうでない場合、.netアプリケーションからすべてのテキストコピー操作(CTRL + C)を監視できますか?
同様の質問:C#で、現在フォーカスされているウィンドウの選択されたテキストコンテンツを一貫して取得できる方法はありますか?
WM_CLIPBOARDUPDATE(非表示の)ウィンドウでメッセージを登録して処理します。
「選択」は普遍的な概念ではなく、各コントロールが独自の方法で処理する場合があります。すべての選択をインターセプトする場合は、Windowsメッセージにグローバルフックを配置し、「既知の」編集コントロール(標準のエディットコントロール、RichEditコントロールなど)に関連する通知をインターセプトして、次のメッセージを除外することができます。見栄えがよく、ソースウィンドウクラスを確認します([編集]ボックスの選択変更とは、他の制御のための核戦争の開始の通知である可能性があります)。すべての選択を取得することはできませんが(たとえば、Wordでの選択は傍受されません)、それらの大部分を取得すると考えるかもしれません。
しかし、大きな問題があります。ウィンドウのないコントロールです。HWNDウィンドウレスコントロールは、その用語自体が言うように、ウィンドウではないため、 sなどを持っていません。実際には、アプリケーションの外部からの追加のインターフェイスなしで、画面上に描画されたピクセルと考えることができます(通常はそれらCOMです)。それらをフックしたり、サブクラス化したりすることはできません。また、通常、COMインターフェースを使用して所有者に通知するため(ランダムな例)、所有者をサブクラス化して通知を受け取ることはできません。確かに、コンテンツを取得するための奇妙な方法があるかもしれませんが、それはおそらく各プロセスでのdllインジェクションを含み、「通常の」編集ボックスに対して提案された方法よりもさらに一般的ではありません。
ウィンドウレスコントロールは非常に普及しているため(たとえば、DirectUIを使用するブラウザーやアプリケーションはHWND、大量のを無駄にしないように使用します。IIRCOfficeもそれらを使用します。また、WPFアプリケーションは独自のウィンドウレスコントロールを使用します。VB6/Delphiアプリケーションはそれらを使用できます。 ...)、多くの選択を見逃してしまうので、コピーインターセプトの方法に従うことをお勧めします。これははるかに簡単で安全です。
この点で、@ Richardのアドバイスに従い、 AddClipboardFormatListenerAPIを使用できます。これはWindowsVista以降でのみ利用可能であることに注意してください。したがって、以前のWindowsバージョンと互換性を持たせたい場合は、古い「ClipboardViewer」APIセットを使用する必要があります。ここにいくつかの情報があります。
ええと、私はそれを忘れていました、私はアクティブアクセシビリティ(しばしば適切に実装されていませんが)がこのタスクであなたを助けることができるかどうかを調査していました、そしてこの有望な方法がありました、しかしそれは選択されたサブオブジェクトのためだけであることがわかりました、そしてそれ、 一般に、
クライアントへの注意 ActiveAccessibilityは、編集およびリッチ編集コントロールでのテキスト選択を公開しません。
ですから、アクセシビリティでさえそのような情報を提供しなければ、それを取得するための他の標準化された方法があることはかなり難しいと思います。