21

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 を使用してツールチップ ウィンドウを有効にするとうまくいかないようです。

4

3 に答える 3

3

考えただけですが、実際のマウスを利用するのではなく、メッセージを使用してみてください。

WM_HOVER、WM_MOUSEHOVER、WM_MOUSEENTERで遊ぶ

 SendMessage(_buttonCtrl.Handle, WM_MOUSEHOVER, ..., ...)

あなたのスクリーンショットはカスタム コントロールのように見えるので、何がツールチップをトリガーするのかを突き止めるのはハッキングの問題になるでしょう。

場合によっては、複数の WM_MOUSEENTER または WM_MOUSEHOVER を同時に送信できます。それは本当に基礎となるコードに依存します。

これが原因で遅延が長すぎる場合 (そして提案された解決策がどれも機能しない場合)、ツールチップ テストを、あまり頻繁に実行されない、または特定の要求でのみ実行されるセカンダリ テスト プールにプルすることを検討してください。

また...そして、あなたはすでに試したことがあると思います...しかし、そうでない場合は、UI Spyをチェックして、実際に生成される前にツールチップに関する情報を報告するかどうかを確認してください.

于 2013-04-13T08:50:35.757 に答える
1

UI オートメーションの観点から私たちができる最善のことは、ToolTip Opened イベントをサブスクライブし、イベント ハンドラーで同じことを処理することです。このリンクにはサンプルhttp://msdn.microsoft.com/en-us/library/ms752286.aspxがあります。UI オートメーション イベントのリストは、http://msdn.microsoft.com/en-us/library/ms748252.aspxにあります。AutomationElement.ToolTipOpenedEvent の詳細については、http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.tooltipopenedevent.aspxを参照してください。

少なくとも UI オートメーションでは、ボタンをクリックするか、ウィンドウを開くか、ツールチップを表示するかのいずれかを実行できるようにする必要があります。そのため、ToolTip イベントをサブスクライブすると、ハードな Sleep() 遅延よりもパフォーマンスが向上します。それ以外の場合、ハックな方法 (エンド ツー エンドではありませんが) は、ツールチップ文字列のリソース文字列 ID を前もって取得し、自動テストの実行中にリソース文字列を確認することです。

于 2013-04-13T08:36:47.330 に答える