win32 レガシ コントロール (本質的にUI Automationをサポートする WPF コントロールではない) のツールヒント テキストを取得したいと思います。
私がやった事:
- 関心のあるボタンが与えられると、その
AutomationElement
と、その境界 rectが得られます - このボタン (コード内) の上にマウスを移動しました。
Thread.Sleep(1500)
ツールチップ コントロールがポップアップするのを待ちます。tooltipAutomationElement
デスクトップのすべての子ウィンドウを列挙し、型が"Tooltip"
;の子ウィンドウを取得します。- から
tooltipAutomationElement
、ツールチップ文字列に対応するこのツールチップの name プロパティを取得します。
これは実際には機能しますが、ペナルティは次のとおりです。sleep(1500)
ツールチップが表示されるまで手動で待機する必要があり (ツールチップ文字列のために 5 ~ 20 個のボタンをスキャンする必要があります)、これはパフォーマンス要件に適合しません。
期待されること(実現可能かどうかは不明)
- ツールチップを表示することなく、ボタンのツールチップ文字列をプログラムで取得する
- 各ボタンに 1 つずつマウスを配置する必要はありません。
更新 1 : の場合TTN_NEEDTEXT
、MSDN のドキュメントはあまり明確ではないようで、C# を使用してこれをプログラムする方法がわかりません。ツールチップ コントロールに関連する低レベルの構造/メッセージの関連リンクの 1 つは、ここにあります。
更新 2 : これが ... によって実行できると信じている人は、言うは易く行うは難しだと思います。これについてコメントしようとした人を歓迎します。その適用性と有効性を示す証拠を提供できれば、表面上は実現可能な解決策を歓迎します。
更新 3 : を最小化できるTTM_SETDELAYTIME
ようN
にを最小化しようとするとsleep(N)
、いくつかの実験の後、これは機能しません。ツールチップ ウィンドウ ハンドルが存在する場合にのみ、これを調整できます。例えば
SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms
更新 4 : メッセージを使用することは解決策のようですが、ツールヒントが作成された後にのみ使用できるTTM_GETTEXTA
のハンドルが必要な更新 3 と似ています。tooltipCtrl
ツールの上にマウス カーソルを合わせると、上記のようにパフォーマンスの問題 ( Thread.Sleep
) があるようです。
SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti);
更新 5 : InterOp (PInvoke) または従来のアプローチを使用したオートメーション UI を使用した「ツールヒント テキストを取得する方法」(ツール ウィンドウにマウスを置いて、Hwnd ハンドルを見つけ、そのテキストを取得する...) は、この投稿の関心事ではありません。 . 期待されること:コントロールにカーソルを合わせる必要なく、コントロール (ボタンなど) のツールチップ文字列を抽出できますか? はいの場合、どのように?
更新 6 : WM_MOUSEHOVER を使用してツールチップ ウィンドウを有効にするとうまくいかないようです。