在第三方窗口上显示QT窗口小部件(在Windows中)

时间:2013-06-04 23:24:25

标签: c++ qt winapi overlay hook

这不是我之前尝试过的,而且对于像HWND这样的人来说是一个完全新手,挂钩等等。

基本上,我想在第三方应用程序的窗口上显示/覆盖QT Widget(我无法控制,我只知道非常基本的信息,如窗口标题/标题及其类名)和我完全不知道怎么会这样做。我还希望QT Widget保留在第三方应用程序窗口的相对位置,即使该窗口在屏幕上移动也是如此。

1 个答案:

答案 0 :(得分:5)

WinAPI部分

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

    1. 使您的顶级QWidgetQMainWindow无框架,并使其window flags Qt::FramelessWindowHintQt::WindowStaysOnTopHint保持最佳状态。
    2. 使用attribute Qt::WA_TranslucentBackground
    3. 使其透明
    4. 设置QTimer以定期请求窗口rect并调整窗口小部件位置。
    5. 示例代码(已测试)

      添加标题:

      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();
        }
      }