如何获取谷歌浏览器窗口句柄并将其设置为Qt的父窗口

1、首先,确保你在项目的 .pro 文件中加入对WinAPI的支持:

cpp 复制代码
win32: LIBS += -luser32

2、步骤概述:

  1. 使用WinAPI获取谷歌浏览器窗口的句柄。
  2. 获取Qt窗口的句柄。
  3. 使用SetParent函数,将Qt窗口设置为谷歌浏览器窗口的子窗口。
  4. 调整Qt窗口的位置和大小以适应谷歌浏览器窗口。

3、代码实现

cpp 复制代码
#include <QApplication>
#include <QMainWindow>
#include <QDebug>
#include <windows.h>
#include <string>

// 回调函数,枚举所有窗口,找到谷歌浏览器窗口句柄
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    char className[256];
    GetClassNameA(hwnd, className, sizeof(className));

    // 检查窗口类名是否是谷歌浏览器
    if (std::string(className) == "Chrome_WidgetWin_1")
    {
        qDebug() << "Found Google Chrome window, HWND:" << hwnd;
        *(HWND*)lParam = hwnd;
        return FALSE; // 找到后停止枚举
    }

    return TRUE; // 继续枚举
}

// 查找谷歌浏览器窗口的句柄
HWND findChromeWindow()
{
    HWND chromeHwnd = nullptr;
    EnumWindows(EnumWindowsProc, (LPARAM)&chromeHwnd);
    return chromeHwnd;
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建一个Qt主窗口
    QMainWindow mainWindow;
    mainWindow.setWindowTitle("Qt Child Window in Chrome");
    mainWindow.resize(800, 600);
    mainWindow.show();

    // 获取谷歌浏览器的窗口句柄
    HWND chromeHwnd = findChromeWindow();
    if (chromeHwnd != nullptr)
    {
        // 获取Qt窗口的句柄
        HWND qtHwnd = (HWND)mainWindow.winId();

        // 将Qt窗口设置为谷歌浏览器窗口的子窗口(即Chrome为父窗口)
        SetParent(qtHwnd, chromeHwnd);

        // 调整Qt窗口的位置和大小,使其适应谷歌浏览器窗口
        SetWindowPos(qtHwnd, nullptr, 0, 0, 800, 600, SWP_NOZORDER | SWP_SHOWWINDOW);

        qDebug() << "Successfully set Qt window as child of Google Chrome window.";
    }
    else
    {
        qDebug() << "Google Chrome window not found.";
    }

    return app.exec();
}

4、解释:

  1. 查找谷歌浏览器窗口 :我们通过 EnumWindows 函数查找类名为 "Chrome_WidgetWin_1" 的窗口,该类名一般对应于谷歌浏览器主窗口。

  2. 获取Qt窗口句柄mainWindow.winId() 返回的是 Qt 窗口的句柄,我们将其作为目标子窗口。

  3. 将Qt窗口设置为谷歌浏览器窗口的子窗口SetParent(qtHwnd, chromeHwnd) 将 Qt 窗口的父窗口设置为谷歌浏览器的窗口。

  4. 调整Qt窗口的大小和位置SetWindowPos 用来调整 Qt 窗口的位置和大小,使其嵌入到谷歌浏览器窗口内,符合你希望的布局。

5、注意事项:

  • 这种方法使得 Qt 窗口成为谷歌浏览器窗口的一部分,受浏览器的窗口管理控制。此时 Qt 窗口就相当于是浏览器中的一个组件或子窗口。
  • 这种操作可能会导致Qt窗口的某些行为受限,特别是在父窗口(谷歌浏览器)发生窗口调整、最小化等事件时,Qt窗口的表现会随之变化。
  • 如果多个浏览器窗口存在,你需要通过特定属性(例如窗口标题、窗口位置、进程ID等)来区分选择正确的谷歌浏览器窗口。
相关推荐
Hui_AI72018 小时前
基于RAG的农产品GEO溯源智能问答系统实现
开发语言·网络·人工智能·python·算法·创业创新
CDwenhuohuo18 小时前
前端文件预览
开发语言·前端·javascript
charlie11451419118 小时前
通用GUI编程技术——图形渲染实战(三十八)——顶点缓冲与输入布局:GPU的第一个三角形
开发语言·c++·学习·图形渲染·win32
IT猿手18 小时前
SCI一区:章鱼优化算法(Octopus Optimization Algorithm, OOA)求解23个测试函数,出图丰富,提供完整MATLAB代码
开发语言·算法·matlab
程序员JerrySUN18 小时前
Jetson边缘嵌入式实战课程第二讲:JetPack 和 SDK Manager 是什么
c语言·开发语言·网络·udp·音视频
不知名的老吴18 小时前
后端知识点:Python处理加权点赞
开发语言·python
用户8055336980318 小时前
现代Qt开发教程(新手篇)1.10——进程
c++·qt
海参崴-18 小时前
C++ STL篇 AVL树的模拟实现
开发语言·c++
Cyber4K18 小时前
【Python专项】基础语法(2)
开发语言·python
某人辛木18 小时前
JDK安装配置
java·开发语言