我需要实现这么一个功能:在知道某个程序的PID的情况下,最大化并且置顶显示这个程序的窗口。经过一番资料的查找,并且借助了一些科技的力量,找到了解决办法:
struct FindWindowData
{
DWORD processId;
HWND hWnd;
};
BOOL FindWindowCB(HWND hWnd, LPARAM lParam)
{
DWORD processId = 0;
if(GetWindowThreadProcessId(hWnd, &processId))
{
// 分配足够大的缓冲区来存储窗口标题
const int MAX_TITLE_LENGTH = 255;
WCHAR windowTitle[MAX_TITLE_LENGTH];
// 调用 GetWindowTextW 来获取窗口标题
int result = GetWindowTextW(hWnd, windowTitle, MAX_TITLE_LENGTH);
// qDebug() << "the text:" << QString::fromWCharArray(windowTitle) << result << hWnd << processId;
QString title = QString::fromWCharArray(windowTitle);
FindWindowData *dataPtr = (FindWindowData*)lParam;
// 这里的筛选条件可能需要继续优化
if(processId == dataPtr->processId && IsWindowVisible(hWnd) && title.length() > 0)
{
qDebug() << "the title text:" << title << result << hWnd << processId;
dataPtr->hWnd = hWnd;
}
return TRUE;
}
return FALSE;
}
// 寻找特定PID的窗口句柄
HWND findWindowByPID(DWORD dwProcessId)
{
FindWindowData winData = {dwProcessId, 0};
LPARAM p = (LPARAM)&winData;
EnumWindows((WNDENUMPROC)FindWindowCB, (LPARAM)p); // 遍历系统上打开的窗口
return winData.hWnd;
}
调用方式请看下面
listProcessIdentifier函数的实现请看前一篇【在Qt中获取Windows中进程的PID】
// 选定要显示的进程的exe名字,获取其PID
QString processName = "";
processName = "MyApp.exe";
QList<quint64> pidList = listProcessIdentifier(processName);
qDebug() << "the pid list:" << pidList;
// 根据PID,取得其窗口句柄hWnd
HWND hWnd = findWindowByPID(pidList.first());
qDebug() << "hwnd:" << hWnd;
ShowWindow(hwnd, SW_MAXIMIZE); // 最大化显示窗口