2

这不是我以前尝试过的东西,并且是 HWND、钩子等之类的完全新手。

基本上,我想在 3rd 方应用程序的窗口顶部显示/覆盖 QT Widget(我无法控制,我只知道非常基本的信息,如窗口标题/标题及其类名),我绝对有不知道怎么做。我还希望 QT Widget 保持在相对于第 3 方应用程序窗口的位置中,即使该窗口在屏幕上移动也是如此。

4

1 回答 1

5

WinAPI 部分

  1. 使用FindWindow函数获取目标窗口的 HWND。
  2. 使用GetWindowRect获取窗口的当前位置。

Qt部分

  1. 使您的顶层QWidgetQMainWindow无框架,并使用窗口标志 Qt::FramelessWindowHintQt::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();
  }
}
于 2013-06-05T10:04:22.750 回答