2017-06-07 12 views
-3

Ich codiere in C++ mit Qt Creator. Ich kann alle Fenster auf dem Bildschirm sehen, aber ich möchte ihre Bewegung direkt erkennen. Gibt es eine Möglichkeit, die Bewegung dank eines vom Fenster ausgesandten Signals zu erkennen?Wie erkennt man die Fensterposition?

+0

* "alle Fenster auf dem Bildschirm" * - was das soll auch bedeuten? – IInspectable

+0

alle Fenster wie der Navigator, geöffnete Anwendungen, .... – andresouris

+0

Ok, in diesem Fall fordere ich Sie auf * "alle Fenster auf dem Bildschirm" *. Ziemlich sicher, dass UIPI ein Schmerz sein wird, um zu überzeugen, dass Ihr Prozess mit niedriger Integrität Zugang zu Ressourcen mit hoher Integrität erhalten sollte. Sie haben jedoch ein völlig falsches Verständnis Ihrer Zielplattform. Qt gibt keine Art von Signalen für Windows aus, die Qt nicht einmal kennen. – IInspectable

Antwort

-1

Sie können versuchen, ein QWindow aus dem Zielfenster zu erstellen und es dann mit QWidget :: createWindowContainer() in ein QWidget einzubinden.

Sie können einen Blick auf dieses QTBUG Gewinde haben: https://bugreports.qt.io/browse/QTBUG-40320

Es braucht einige Mühe, es richtig zu arbeiten. Das erfasste Fenster behält seine ursprünglichen Abmessungen nicht bei und das Freigeben des Fensters verhält sich merkwürdig. Lesen Sie die letzten QTBUG-Kommentare, um eine Verbesserung zu finden.

Ich habe einen Ereignisfilter zu diesem Code hinzugefügt, um die Fensterposition in Echtzeit zu erfassen. Aber das könnte unbefriedigend sein.

Ich habe Teil 3 aus dem QTBUG-Snippet entfernt und den Event-Handler auf dem inneren Widget installiert. Sie können die Timer auch entfernen.

// From https://bugreports.qt.io/browse/QTBUG-40320 
int main(int argc, char *argv[]) 
{  
    // Windows: Find HWND by window title 
    WId id = (WId)FindWindow(NULL, L"Calculator"); 
    if (!id) 
     return -1; 

    QApplication a(argc, argv); 
    // Optional 
    QTimer t; 
    t.start(2500); 

    // Part 1 
    QWindow* window = QWindow::fromWinId(id); 
    window->show(); 
    window->requestActivate(); 

    // Optional 
    QObject::connect(&t, &QTimer::timeout, [=] 
    { 
     qDebug() << "=== Inner QWindow ==="; 
     qDebug() << "Geometry:" << window->geometry(); 
     qDebug() << "Active?:" << window->isActive(); 
     qDebug() << "Flags:" << window->flags(); 
    }); 

    // Part 2 
    QWidget* widget = QWidget::createWindowContainer(window); 
    widget->show(); 

    // Optional 
    QObject::connect(&t, &QTimer::timeout, [=] 
    { 
     qDebug() << "=== Outer QWidget ==="; 
     qDebug() << "Geometry:" << widget->geometry(); 
     qDebug() << "Active?" << widget->isActiveWindow(); 
     qDebug() << "Flags:" << widget->windowFlags(); 
    }); 

    // Realtime position 
    EventFilter filter ; 
    widget->installEventFilter(&filter) ; 


    return a.exec(); 
} 

Ausgang:

=== Inner QWindow === 
Geometry: QRect(0,0 640x480) 
Active?: true 
Flags: QFlags<Qt::WindowType>(ForeignWindow) 
=== Outer QWidget === 
Geometry: QRect(2489,29 640x480) 
Active? true 
Flags: QFlags<Qt::WindowType>(Window|WindowTitleHint|WindowSystemMenuHint|WindowMinMaxButtonsHint|WindowCloseButtonHint) 

QEvent::Type(Move) 
position QPoint(2484,29) 
QEvent::Type(Move) 
position QPoint(2481,30) 
QEvent::Type(Move) 
position QPoint(2478,31) 
QEvent::Type(Move) 
position QPoint(2474,31) 

Siehe auch http://blog.qt.io/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/

+0

Funktioniert nicht über UIPI-Grenzen hinweg. Und das Erreichen eines Fensters, das einem anderen Thread gehört, erfordert, dass Sie genau wissen, was Sie tun, und den Code in beiden Threads für eine ordnungsgemäße Zusammenarbeit steuern. Sie steuern den Code in keinem der beiden Threads. Dieser ** wird ** brechen. – IInspectable

+0

P.S .: Eine stabile Lösung verwendet [WinEvents] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd373868.aspx). – IInspectable