Qt调用Chrome浏览器
创始人
2025-05-31 20:29:16
0

一、前言

最近有个小项目需要跳转网页,之前有了解过,但是没有在项目中使用过Qt网页嵌入;

结合自己之前的博客,有如下两种技术可以实现我的需求:

1、Qt–网页嵌入

2、Qt使用QAxWidget调用Windows组件

但是在实际开发中发现:

  • 技术一:使用QWebEngineView来展示网页,卡顿,界面还有时闪退,不知如何解决;
  • 技术二:使用QAxWidget调用Windows组件,就是调用IE浏览器,发现IE浏览器太老,老是弹出脚本页面错误;

然后就想到了调用Chrome浏览器的方案!


二、调用Chrome步骤

问题描述:利用chrome谷歌浏览器打开多个网页(多个窗口显示),分别获取每个窗口的句柄,并能对各个窗口设置大小和位置;

  • 打开多个窗口 用 --new-window
  • 获取打开网页(一个网页一个窗口)的窗口句柄,浏览器并不像应用程序一样只有一个进程,打开一个chrome谷歌浏览器默认会有一个主进程和多个子进程,关键是要找到自己打开的那个网页的进程。所有我只能通过标签的名字来想办法了。因为这些子进程的类名都是“Chrome_WidgetWin_1”,根本无法分辨。

2.1、用进程QProcess打开chrome谷歌浏览器

QString appUrl ="C:/Users/wangjichuan/AppData/Local/Google/Chrome/Application/chrome.exe";
QFile file_Chrome(appUrl);
if(!file_Chrome.exists()){qDebug()<<"Chrome.exe 路径错误";return;
}QStringList arguments;
arguments <<" --new-window"<<"www.baidu.com";QProcess* chrome_Process = new QProcess();
chrome_Process->start(appUrl,arguments);
chrome_Process->waitForFinished(1000);

2.2、获取刚才打开的百度网页的窗口句柄

PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL find = Process32First(hp, &pe32);
QList hwndList;
while (find) {find = Process32Next(hp, &pe32);QString str1 = QString::fromWCharArray(pe32.szExeFile);if(str1=="chrome.exe") {DWORD jinchengid = pe32.th32ProcessID;hwndList = GetWindowHandleByPIDq(jinchengid);break;}
}if(hwndList.size() == 1) {m_HWND_list.append(hwndList.at(0));QWindow *pWin = QWindow::fromWinId((WId)hwndList.at(0));//根据句柄获得该窗口pWin->setGeometry(0,0,1920,1080);//对窗口设置位置和大小
}

函数: GetWindowHandleByPIDq

QList Widget::GetWindowHandleByPIDq(DWORD dwProcessID)//通过进程ID获取子窗口
{QList HWND_list;HWND h = ::GetTopWindow(0);while (h){DWORD pid = 0;DWORD dwTheardId = GetWindowThreadProcessId(h, &pid);if (dwTheardId != 0) {if(pid==dwProcessID) {TCHAR *name=new TCHAR[MAX_PATH];//::GetClassName(h, name, 255);::GetWindowTextW(h, name, 255);QString title = QString :: fromStdWString(name);if(title.contains("- Google Chrome")&&title!="任务管理器 - Google Chrome") {   //自己打开的窗口都是以- Google Chrom结尾HWND_list.append(h);  //HWND_list记录所有谷歌浏览器下打开的窗口if(m_HWND_list.contains(h)) {   //m_HWND_list存的是之前已经打开并记录下来的窗口  m_HWND_list需自己在头文件定义一下 QList m_HWND_list;HWND_list.removeOne(h);//只记录现在打开的窗口}}}}h = ::GetNextWindow(h, GW_HWNDNEXT);}return HWND_list;//返回的最新打开的窗口(就一个)
}

三、相关代码

头文件

#include 
#include 
#include 
#include class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public:QList m_HWND_list;QList GetWindowHandleByPIDq(DWORD dwProcessID);QProcess* chrome_Process{nullptr};void startChrome(QString web);void closeChrome();private:Ui::Widget *ui;
};
#endif // WIDGET_H

源文件

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);closeChrome();startChrome("www.baidu.com");}
Widget::~Widget()
{delete ui;
}//============================================================================================
void Widget::startChrome(QString web)
{//浏览器窗口//1、用进程QProcess打开chrome谷歌浏览器QString appUrl ="C:/Users/wangjichuan/AppData/Local/Google/Chrome/Application/chrome.exe";QFile file_Chrome(appUrl);if(!file_Chrome.exists()){qDebug()<<"Chrome.exe 路径错误";return;}QStringList arguments;arguments <<" --new-window"<<"www.baidu.com";chrome_Process = new QProcess();chrome_Process->start(appUrl,arguments);chrome_Process->waitForFinished(1000);//2、获取刚才打开的百度网页的窗口句柄PROCESSENTRY32 pe32;pe32.dwSize = sizeof(pe32);HANDLE hp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);BOOL find = Process32First(hp, &pe32);QList hwndList;while (find) {find = Process32Next(hp, &pe32);QString str1 = QString::fromWCharArray(pe32.szExeFile);if(str1=="chrome.exe") {DWORD jinchengid = pe32.th32ProcessID;hwndList = GetWindowHandleByPIDq(jinchengid);break;}}if(hwndList.size() == 1) {m_HWND_list.append(hwndList.at(0));QWindow *pWin = QWindow::fromWinId((WId)hwndList.at(0));//根据句柄获得该窗口pWin->setGeometry(0,0,1920,1080);//对窗口设置位置和大小}
}
void Widget::closeChrome()
{if(chrome_Process) {chrome_Process->close();}
}
QList Widget::GetWindowHandleByPIDq(DWORD dwProcessID)//通过进程ID获取子窗口
{QList HWND_list;HWND h = ::GetTopWindow(0);while (h){DWORD pid = 0;DWORD dwTheardId = GetWindowThreadProcessId(h, &pid);if (dwTheardId != 0) {if(pid==dwProcessID) {TCHAR *name=new TCHAR[MAX_PATH];//::GetClassName(h, name, 255);::GetWindowTextW(h, name, 255);QString title = QString :: fromStdWString(name);if(title.contains("- Google Chrome")&&title!="任务管理器 - Google Chrome") {   //自己打开的窗口都是以- Google Chrom结尾HWND_list.append(h);  //HWND_list记录所有谷歌浏览器下打开的窗口if(m_HWND_list.contains(h)) {   //m_HWND_list存的是之前已经打开并记录下来的窗口  m_HWND_list需自己在头文件定义一下 QList m_HWND_list;HWND_list.removeOne(h);//只记录现在打开的窗口}}}}h = ::GetNextWindow(h, GW_HWNDNEXT);}return HWND_list;//返回的最新打开的窗口(就一个)
}
//============================================================================================

相关内容

热门资讯

“降息”降首付!楼市政策组合拳... 1月15日,人民银行新闻发言人、副行长邹澜在国新办新闻发布会上表示,下调各类结构性货币政策工具利率0...
原创 美... 马杜罗的罪名虽然尚未确定,特朗普却已悄然出手,将委内瑞拉的石油资源首次变现。近日,一名美国官员透露,...
晕了晕了!宽基指数ETF遭主力... 每经记者|叶峰 每经编辑|肖芮冬 本周股指涨跌互现,沪深两市股票型ETF和跨境型ETF合计净流出1...
国投资本跌1.04%,成交额3... 来源:新浪证券-红岸工作室 1月16日,国投资本跌1.04%,成交额3.01亿元,换手率0.61%,...
越秀资本:拟出售中信证券不超过... 北京商报讯(记者 刘宇阳)1月16日,广州越秀资本控股集团股份有限公司(以下简称“越秀资本”)发布公...
追觅CEO俞浩回应近期质疑:过... 1月17日,追觅CEO发文回应近期质疑。 俞浩表示,把目标定在百万亿美元市值一事,时间是未来,不是一...
沃尔玛牵手小红书,首家联名店落... 深圳商报·读创客户端首席记者 刘琼 1月16日,沃尔玛与小红书共同宣布,双方达成深度合作,将围绕商品...
奥特曼秘密持股OpenAI!法... 梦晨 发自 凹非寺 量子位 | 公众号 QbitAI 硅谷最贵的一场官司,有了新进展。 马斯克诉Op...
消费观察| 种草到造货,沃尔玛... 深圳商报首席记者 刘琼 文/图 沃尔玛和小红书“玩出”新花样”。1月16日,沃尔玛和小红书首家联名店...
海南封关满月看变化:“中国洋浦... 来源:中国新闻网 中新网儋州1月17日电 (记者 王子谦)“海南自贸港封关后,我们每引航两艘国际船舶...
冲刺“A+H”两地上市,青岛国... 转自:山东财经报道 文 | 山东财经报道 1月15日晚间,国恩股份(002768.SZ)发布公...
央企掌门人年薪披露:20人超9... 国务院国资委共披露87家中央企业负责人2024年度薪酬信息。与2025年7月国务院国资委发布的100...
新华社:税务部门提醒纳税人对近... 来源:新华社 记者1月16日从国家税务总局有关部门获悉,税务机关持续加强对居民个人境外所得纳税的宣...
易观分析:2025年AI精准医... 今天分享的是:易观分析:2025年AI精准医疗市场专题分析报告 报告共计:21页 2025年AI精准...
中成进出口股份有限公司 202... 证券代码:000151 证券简称:中成股份 公告编号:2026-09 中成进出口股份有限公司 202...
两部门发文延续实施境外机构投资... 财政部 税务总局 关于延续实施境外机构投资国债和地方政府债券增值税政策的公告 财政部 税务总局公告2...
原创 高... 中国高校在科研榜单上的强势崛起,已经让老牌学术强国感到了前所未有的压力。最新的排名数据清晰地揭示了一...
ETF科普:一篮子资产投资新选... ETF是个舶来品,对应的英文是exchange traded fund,简单说就是在交易所挂牌上市交...
万亿民营企业再贷款,助力民营经... 来源:西部网 1万亿元,专供民营企业。 你没看错,1月15日,央行送出政策大礼包。其中,最受瞩目的莫...
河南印发法治医院建设规范 日前,河南省卫生健康委印发《河南省法治医院建设规范》(简称《规范》),河南法治医院建设迈入标准化、体...