Windows上でQt5アプリケーションのQPainter::drawText()
機能にフックします。 私の目標は、テキストが描画されるトップレベルウィンドウのネイティブハンドルを識別することです。まず、関連するウィジェットを取得しています。ウィジェットでトップレベルウィンドウを取得する
QWidget *widget = static_cast<QWidget *>(painter->device());
対応する最上位のウィンドウ/ウィジェットを見つけることができるはずです。 しかし、それは私が思ったよりも難しいです。これは私がこれまで試したものです:
while (widget->parentWidget())
widget = widget->parentWidget();
HWND hwnd = (HWND) widget->winId();
ません成功。トップの親は決して望ましいウィンドウではありません。
QApplication::topLevelWidgets()
は、1つのウィンドウは、(私が探しているものを含む)いくつかのトップレベル・ウィジェットが含まれていることを見せてくれました。
また、私は、これは実際に動作するいくつかのケースではQApplication::topLevelAt(widget->mapToGlobal(QPoint()))
を試してみましたが、ない確実。 テキストとウィンドウの位置によってはAccessViolationException
、 が表示されます。これはオプションではありません。
テストではwidget->testAttribute(Qt::WA_NativeWindow)
私はほとんどのウィジェットが非ネイティブのAlien Widgetsであることが判明しました。
これは私が(私が何と呼ぶ)トップレベルウィンドウを取得する方法です。
WinAPI.EnumChildWindows(
WinAPI.GetDesktopWindow(),
new EnumWindowsProc(this.EnumWindowsCallback), 0);
それから私は、私が興味のハンドルを見つけるために、ウィンドウのタイトルを確認してください。
私は(トップレベルへの(低レベル)のウィジェットからの関係を見つけることができないんだけど)ウィジェット。ウィンドウタイトルを保持します。
明確にする:最初の「コンテナクライアント」または「トップレベルウィンドウ」のハンドルを探していますか?コードを表示したり、「トップレベルウィジェット」がその1つのウィンドウにどのように関連しているかを記述できますか? – JKSH
Windows APIやサードパーティのユーティリティを使用してQtでペイントすると、ネイティブウィジェットとペイントに埋め込まない限り、確実に動作する可能性は低いことに注意してください。 –
私は何も描きたくありません。私は、アプリケーションのテキスト出力全体をインターセプトし、各文字列をいくつかのキーワードと比較しています。 一致するものが見つかった場合は、アプリケーションの開いているウィンドウの1つにマップします。 – m1st4x