Window 唤起进程,并使窗口最前显示

使用场景:

程序中调用某进程:若进程未打开,调用打开此进程;若进程已打开,则使此进程最前显示;

方法步骤:

1.根据进程名称获取进程ID;

2.根据进程ID,获取窗口句柄;

3.根据窗口句柄,设置最前显示;

代码如下:

static HWND GetWindowHandleByPID(DWORD dwProcessID)//通过进程ID获取窗口句柄
{
	HWND h = ::GetTopWindow(0);
	while (h)
	{
		DWORD pid = 0;
		DWORD dwTheardId = GetWindowThreadProcessId(h, &pid);
		if (dwTheardId != 0)
		{
			if (pid == dwProcessID)
			{
				// here h is the handle to the window
				while (::GetParent(h) != NULL)
					h = ::GetParent(h);
				return h;
			}
		}
		h = ::GetNextWindow(h, GW_HWNDNEXT);
	}
	return NULL;
}



static void testFunc()
{
	bool isFindExe = false;
	std::wstring child_proc_name = L"chrome.exe";

	// 获取进程列表快照
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	// 存储进程实体信息
	PROCESSENTRY32 pe;
	pe.dwSize = sizeof(PROCESSENTRY32);

	// 获取进程列表快照中,第一个进程信息
	if (FALSE == Process32First(hSnapShot, &pe))
	{
		isFindExe = false;
	}
	else
	{
		// 逐个获取进程列表快照中的进程
		while (Process32Next(hSnapShot, &pe))
		{
			if (0 == child_proc_name.compare(pe.szExeFile))
			{
				isFindExe = true;
				HWND w = NULL;
				w = GetWindowHandleByPID(pe.th32ProcessID);//根据id获取窗口句柄
				if (w != NULL)
				{
					ShowWindow(w, SW_SHOWNORMAL);
					SendMessage(w, WM_ACTIVATE, WA_ACTIVE, 0);
					SetForegroundWindow(w);
					break;
				}
			}
		}
	}

	if (!isFindExe)
	{
		//重新打开进程
	}
}

备注:

在设置窗口最前显示的时候,由于测试用的是浏览器进程,当浏览器最小化之后,网上找了一些的方法很难再唤起;所以最后选择发送消息的方式唤起;重点代码:

ShowWindow(w, SW_SHOWNORMAL);

SendMessage(w, WM_ACTIVATE, WA_ACTIVE, 0);

SetForegroundWindow(w);

注意:

网上搜索的关于设置窗口最前显示的方法,大部分都是下面这几种:

ShowWindow(w, SW_SHOWNORMAL);

SetWindowPos(w, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

SetWindowPos(w, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

SetForegroundWindow(w);

AttachThreadInput(dwCurID, dwForeID, FALSE);

这些方式在遇到窗口最小化之后,就有很多无法唤起;或者窗口不是MFC的时候,也容易唤起失败;

以上,

原创,转载请注明出处;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以使用QProcess进行子进程的创建和管理。然而,QProcess本身并不提供获取窗口句柄的功能。要获取子进程窗口句柄,可以借助一些底层操作系统的API。 首先,在Qt中启动子进程之后,可以使用QProcess的pid()函数获取子进程进程ID。然后,可以使用操作系统相关的API来获取子进程窗口句柄。以下以Windows操作系统为例,介绍如何实现: 1. 使用QProcess启动子进程。 ``` QProcess process; process.start("your_executable_file"); ``` 2. 获取子进程进程ID。 ``` qint64 pid = process.pid(); ``` 3. 使用Windows API函数EnumWindows()遍历所有顶级窗口,并查找与子进程进程ID对应的窗口。 ```cpp #include <windows.h> HWND childWindow = nullptr; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD pid; GetWindowThreadProcessId(hwnd, &pid); if (pid == static_cast<DWORD>(lParam)) { childWindow = hwnd; return FALSE; // 找到目标窗口后,终止遍历 } return TRUE; } EnumWindows(EnumWindowsProc, static_cast<LPARAM>(pid)); ``` 4. 最后,可以使用获取到的窗口句柄进行后续操作,例如设置窗口属性、发送消息等。 ```cpp // 设置窗口标题 QString title = "New Window Title"; SetWindowText(childWindow, title.toStdWString().c_str()); // 发送消息到子进程窗口 std::wstring message = L"Hello from Parent"; SendMessage(childWindow, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(message.c_str())); ``` 需要注意的是,获取窗口句柄是操作系统相关的操作,不同平台可能有不同的实现方式。因此,上述代码只适用于Windows平台。在其他平台上,可能需要使用不同的API函数或方法来获取窗口句柄。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值