2017-06-07 5 views
-3

Je suis en train de coder en C++ avec le créateur Qt. Je peux obtenir toutes les fenêtres sur l'écran mais je voudrais détecter leur mouvement directement. Est-il possible de détecter le mouvement grâce à un signal émis par la fenêtre?Comment détecter directement la position de la fenêtre?

+0

* "toutes les fenêtres sur l'écran" * - ce qui est que même censé vouloir dire? – IInspectable

+0

toutes les fenêtres comme le navigateur, les applications ouvertes, .... – andresouris

+0

Ok, dans ce cas, je vais vous mettre au défi de * "obtenir toutes les fenêtres sur l'écran" *. Assez sûr que UIPI va être une douleur à convaincre, que votre processus de faible intégrité devrait avoir accès à des ressources de haute intégrité. Mais de toute façon, vous avez une compréhension complètement erronée de votre plate-forme cible. Qt n'émet aucune sorte de signaux pour les fenêtres, qui ne connaissent même pas Qt. – IInspectable

Répondre

-1

Vous pouvez essayer de créer un QWindow à partir de la fenêtre cible, puis l'insérer dans un QWidget en utilisant QWidget :: createWindowContainer().

Vous pouvez jeter un oeil à ce fil QTBUG: https://bugreports.qt.io/browse/QTBUG-40320

Il faut un certain effort pour le faire fonctionner correctement. La fenêtre capturée ne conserve pas ses dimensions initiales, et la libération de la fenêtre se comporte bizarrement. Lisez les derniers commentaires de QTBUG pour trouver une amélioration.

J'ai ajouté un filtre d'événement à ce code pour capturer la position de la fenêtre en temps réel. Mais cela pourrait être insatisfaisant. J'ai supprimé la partie 3 de l'extrait QTBUG et installé le gestionnaire d'événements sur le widget interne. Vous pouvez également supprimer les minuteurs.

// 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(); 
} 

Sortie:

=== 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) 

Voir aussi http://blog.qt.io/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/

+0

Ne fonctionne pas à travers les frontières de l'UIPI. Et tendre la main à une fenêtre appartenant à un thread différent nécessite, que vous sachiez ** exactement ** ce que vous faites, et contrôlez le code dans les deux threads pour une coöperation correcte. Vous ne contrôlez pas le code dans les deux threads. Cette ** va ** casser. – IInspectable

+0

P.S .: Une solution robuste utilise [WinEvents] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd373868.aspx). – IInspectable