4 березня 2016 р.

Qt. Вбудува до вікна QWindow вікна зовнішньої програми.


Задача вбудувати роботу зовнішньої програми (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
Використовується додатково user32.dll.

Немає коментарів:


Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready