Задача вбудувати роботу зовнішньої програми (mpv) до проекту Qt. Тобто створити вікно QWindow, і прикріпити до нього вікно зовнішньої програми. За результатами публікації створено цей код.
Програма, спершу шукає вікно за назвою вікна "No file - mpv", а якщо не знаходить до за назвою класу "mpv". Так як заголовок вікна може бути різним в залежності від відкритого відео файлу.
За назвою знаходиться ідентифікатор вікна id, створюється QWindow за цим ідентифікатором. Надалі створюється QWidget за створеним QWindow, та підганяється розмір.
Після 2х секунд, програма повертає вікно плеєра mpv в відокремлений стан.
embededWindow.pro:
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = embededWindow TEMPLATE = app SOURCES += main.cpp LIBS+= -luser32
main.cpp:
#include "windows.h" #include <QApplication> #include <QWindow> #include <QWidget> #include <QDebug> #include <QTimer> int main(int argc, char *argv[]) { QApplication a(argc, argv); // Windows: Find HWND by window title WId id = (WId)FindWindow(NULL, L"No file - mpv"); if (id) { qDebug()<<"Found by tile"; TCHAR ClassName[MAX_PATH]; int r=GetClassName((HWND)id,ClassName,_countof(ClassName)); if (r){ qDebug()<<"GetClassName"<<r<<QString::fromWCharArray(ClassName); } }else{ TCHAR ClassName[]=L"mpv"; id = (WId)FindWindowEx(NULL,NULL,ClassName,NULL); if (id) qDebug()<<"Found by ClassName"; } if (!id) { qDebug()<<"not found Window"<<id; return -1; } // Part 1 QWindow* window = QWindow::fromWinId(id); window->show(); window->requestActivate(); // Part 2 QWidget* widget = QWidget::createWindowContainer(window); widget->show(); widget->resize(window->geometry().size()); QTimer t; t.start(2000); // detach QObject::connect(&t, &QTimer::timeout, [=] { window->setParent(nullptr); }); return a.exec(); }
Оригінальний плеєр mpv |
Embedded плеєр mpv |
Від'єднаний плеєр mpv |
Немає коментарів:
Дописати коментар