问题描述:利用chrome谷歌浏览器打开多个网页(多个窗口显示),分别获取每个窗口的句柄,并能对各个窗口设置大小和位置
问题分析:重点:1.打开多个窗口 用 --new-window
2.获取打开网页(一个网页一个窗口)的窗口句柄,浏览器并不像应用程序一样只有一个进程,打开一个chrome谷歌浏览器默认会有一个主进程和多个子进程,关键是要找到自己打开的那个网页的进程。所有我只能通过标签的名字来想办法了。因为这些子进程的类名都是“Chrome_WidgetWin_1”,根本无法分辨。
具体解决代码:
1.用进程QProcess打开chrome谷歌浏览器
QString appUrl ="C:/Users/IM/AppData/Local/Google/Chrome/Application/chrome.exe";
if(appUrl=="")
{
return ;
}
QStringList arguments;
arguments <<" --new-window"<<"www.baidu.com";
QProcess* pProcess = new QProcess();
pProcess->start(appUrl,arguments);
pProcess->waitForFinished(1000);
2.获取刚才打开的百度网页的窗口句柄
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
HANDLE hp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL find = Process32First(hp, &pe32);
QList<HWND> hwndList;
while (find)
{
find = Process32Next(hp, &pe32);
QString str1 = QString::fromWCharArray(pe32.szExeFile);
if(str1=="chrome.exe")
{
qDebug()<<str1<<pe32.th32ProcessID;
DWORD jinchengid = pe32.th32ProcessID;
hwndList = GetWindowHandleByPIDq(jinchengid);
//qDebug()<<"窗口句柄 "<<chuangkoujubing;
break;
}
}
if(hwndList.size() == 1)
{
m_HWND_list.append(hwndList.at(0));
QWindow *pWin = QWindow::fromWinId((WId)hwndList.at(0));//根据句柄获得该窗口
pWin->setGeometry(x,y,iwidth,iheight);//对窗口设置位置和大小
qDebug()<<"m_HWND_list "<<m_HWND_list;
}
QList<HWND> DlgWnd::GetWindowHandleByPIDq(DWORD dwProcessID)//通过进程ID获取子窗口
{
QList<HWND> 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);
qDebug()<<title;
if(title.contains("- Google Chrome")&&title!="任务管理器 - Google Chrome")//自己打开的窗口都是以- Google Chrom结尾
{
//qDebug()<<"打开的窗口 "<<h;
HWND_list.append(h); //HWND_list记录所有谷歌浏览器下打开的窗口
if(m_HWND_list.contains(h))//m_HWND_list存的是之前已经打开并记录下来的窗口 m_HWND_list需自己在头文件定义一下 QList<HWND> m_HWND_list;
{
HWND_list.removeOne(h);//只记录现在打开的窗口
}
}
//return h;
}
}
h = ::GetNextWindow(h, GW_HWNDNEXT);
}
qDebug()<<"打开的新窗口 "<<HWND_list;
return HWND_list;//返回的最新打开的窗口(就一个)
}
头文件必须加上:
#include <QWindow>
#include <windows.h>
#include <TlHelp32.h>