Это не то, что я пробовал раньше, и я новичок в таких вещах, как HWND, хук и т.д.
По сути, я хотел бы отобразить / наложить виджет QT поверх окна стороннего приложения (которое я не могу контролировать, я знаю только очень основную информацию, такую как заголовок / заголовок окна и его имя класса), и у меня есть абсолютно понятия не имею, как можно поступить об этом. Я также хочу, чтобы виджет QT оставался в нем относительно окна стороннего приложения, даже если это окно перемещается по экрану.
QWidget
или же QMainWindow
без рамки и сделайте так, чтобы оставаться на вершине, используя оконные флаги Qt::FramelessWindowHint
а также Qt::WindowStaysOnTopHint
,Qt::WA_TranslucentBackground
,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();
}
}
Других решений пока нет …