Ich bin die QPainter::drawText()
Funktion einer Qt5-Anwendung unter Windows. Mein Ziel ist es, das native Handle des Toplevel-Fensters zu identifizieren, auf das der Text gemalt wird. Zuerst erhalte ich das zugehörige Widget.Erste-Ebene-Fenster von Widget
QWidget *widget = static_cast<QWidget *>(painter->device());
So sollte es möglich sein, das entsprechende Top-Level-Fenster/Widget zu finden. Aber es ist schwieriger als ich dachte. Das habe ich bisher versucht:
while (widget->parentWidget())
widget = widget->parentWidget();
HWND hwnd = (HWND) widget->winId();
Kein Erfolg. Der oberste Elternteil ist niemals das gewünschte Fenster.
QApplication::topLevelWidgets()
zeigte mir, dass ein einzelne Fenster mehr Top-Level-Widgets (einschließlich dem ich suche) enthält.
Ich habe auch versucht QApplication::topLevelAt(widget->mapToGlobal(QPoint()))
In einigen Fällen ist dies tatsächlich funktioniert, aber nicht zuverlässig. Je nach Text und Fensterposition bekomme ich eine AccessViolationException
, , also ist dies keine Option.
Durch Testen widget->testAttribute(Qt::WA_NativeWindow)
fand ich heraus, dass die meisten Widgets nicht native Alien Widgets sind.
So bekomme ich das (was ich nenne) Top-Level-Fenster.
WinAPI.EnumChildWindows(
WinAPI.GetDesktopWindow(),
new EnumWindowsProc(this.EnumWindowsCallback), 0);
Dann prüfe ich die Fenstertitel die Griffe finden Ich habe Interesse an.
Ich bin nicht in der Lage eine Beziehung von jedem (Low-Level) Widget in die (Top-Level zu finden) Widget, das den Fenstertitel enthält.
Zur Verdeutlichung: Suchen Sie nach dem Handle des ersten "Container 'Client'" oder Ihres "Top-Level-Window"? Können Sie Code anzeigen oder beschreiben, wie sich Ihre "Top-Level-Widgets" auf dieses einzelne Fenster beziehen? – JKSH
Bitte beachten Sie, dass die Verwendung der Windows-API oder eines Dienstprogramms eines Drittanbieters zum Zeichnen in Qt höchstwahrscheinlich nicht zuverlässig funktioniert, wenn Sie nicht ein natives Widget einbetten und darauf malen. –
Ich möchte nichts zeichnen. Ich fange die gesamte Textausgabe der Anwendung ab und vergleiche jede Zeichenfolge mit einigen Schlüsselwörtern. Wenn ich eine Übereinstimmung finde, möchte ich sie einem der geöffneten Fenster der Anwendung zuordnen. – m1st4x