7

システム全体のホットキーを登録する小さなトレイ アプリケーションがあります。ユーザーがアプリケーションの任意の場所でテキストを選択してこのホットキーを押すと、選択したテキストをキャプチャできるようにしたいと考えています。現在、AutomationElements を使用してこれを行っています。

//Using FocusedElement (since the focused element should be the control with the selected text?)
AutomationElement ae = AutomationElement.FocusedElement;        
AutomationElement txtElement = ae.FindFirst(TreeScope.Subtree,Condition.TrueCondition);
if(txtElement == null)
    return;

TextPattern tp;

try
{
    tp = txtElement.GetCurrentPattern(TextPattern.Pattern) as TextPattern;
}
catch(Exception ex)
{
    return;
}

TextPatternRange[] trs;

if (tp.SupportedTextSelection == SupportedTextSelection.None)
{
    return;
            }
else
{
    trs = tp.GetSelection();
    string selectedText = trs[0].GetText(-1);
    MessageBox.Show(selectedText );

}

これは、一部のアプリ (メモ帳、ビジュアル スタジオの編集ボックスなど) では機能しますが、すべてのアプリ (Word、FireFox、Chrome など) では機能しません。

任意のアプリケーションで選択したテキストを取得できるようにする方法について何かアイデアを持っている人はいますか?

4

3 に答える 3

7

残念ながら、選択したテキストを任意のアプリケーションから取得する方法はありません。UI オートメーションは、アプリケーションが UIA TextPattern をサポートしている場合に機能します。残念ながら、ほとんどはそうではありません。これを実行しようとするアプリケーションを作成し、多数のフォールバックを用意しました。

私は試しました(かなり順番に):

  1. UIA.TextPattern
  2. Internet Explorer 固有 (IE 6、7、8、9 では実装が異なります)
  3. Adobe Reader 固有
  4. クリップボード

これは、世の中に出回っているアプリケーションの 80 ~ 90% をカバーしていましたが、まだ失敗したアプリケーションもかなりありました。

クリップボードの復元には、それ自体の問題があることに注意してください。一部のアプリケーション (Office など) は、内部データへのポインタを持つことができるベンダー固有の情報をクリップボードに入れます。自分の情報をクリップボードに入れると、内部データが解放され、古いデータを元に戻すと、クリップボードが解放されたデータを指すようになり、クラッシュが発生します。既知のクリップボード形式のみを保存/復元することでこれを回避できますが、これもアプリがクラッシュするのではなく「間違った」動作をするという奇妙な動作になります。

于 2013-07-11T21:42:43.727 に答える
2

UIAテクノロジはすべてのアプリケーションでサポートされているわけではありません。場合によっては (FF、Chrome など) MSAAを使用することもできますが、それでも多くの問題が発生します。最善の方法は、現在のクリップボード テキストを保存し、 SendMessage WinAPI 関数を介して "CTRL + C" キープレス メッセージを送信し、クリップボード テキストを取得し、リックが言ったように最初のクリップボード テキストを復元することです。

于 2010-11-22T10:12:39.567 に答える
1

クリップボードを見て、ホットキーを CTRL+C にすることはできますか?

選択したテキストをどのアプリケーションからも読み取ることができなくなります。たとえば、一部の PDF ファイルには、コピーを禁止する保護されたコンテンツが含まれています。

于 2010-11-22T09:50:31.447 に答える