Отображение виджета QT на / наложение стороннего окна (в Windows)

Это не то, что я пробовал раньше, и я новичок в таких вещах, как HWND, хук и т.д.

По сути, я хотел бы отобразить / наложить виджет QT поверх окна стороннего приложения (которое я не могу контролировать, я знаю только очень основную информацию, такую ​​как заголовок / заголовок окна и его имя класса), и у меня есть абсолютно понятия не имею, как можно поступить об этом. Я также хочу, чтобы виджет QT оставался в нем относительно окна стороннего приложения, даже если это окно перемещается по экрану.

2

Решение

WinAPI часть

  1. использование FindWindow функция для получения HWND целевого окна.
  2. использование GetWindowRect получить текущую позицию окна.

Часть Qt

  1. Сделай свой верхний уровень QWidget или же QMainWindow без рамки и сделайте так, чтобы оставаться на вершине, используя оконные флаги Qt::FramelessWindowHint а также Qt::WindowStaysOnTopHint,
  2. Сделайте его прозрачным, используя атрибут Qt::WA_TranslucentBackground,
  3. Настройте QTimer периодически запрашивать прямоугольник окна и корректировать положение виджета.

Пример кода (проверено)

Добавить в шапку:

private:
HWND target_window;

private slots:
void update_pos();

Источник:

#include "Windows.h"#include <QDebug>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
setAttribute(Qt::WA_TranslucentBackground);
// example of target window class: "Notepad++"target_window = FindWindowA("Notepad++", 0);
if (!target_window) {
qDebug() << "window not found";
return;
}
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update_pos()));
timer->start(50); // update interval in milliseconds
}

MainWindow::~MainWindow() {
delete ui;
}

void MainWindow::update_pos() {
RECT rect;
if (GetWindowRect(target_window, &rect)) {
setGeometry(rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top);
} else {
//maybe window was closed
qDebug() << "GetWindowRect failed";
QApplication::quit();
}
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]