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?
Répondre
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/
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
P.S .: Une solution robuste utilise [WinEvents] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd373868.aspx). – IInspectable
* "toutes les fenêtres sur l'écran" * - ce qui est que même censé vouloir dire? – IInspectable
toutes les fenêtres comme le navigateur, les applications ouvertes, .... – andresouris
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