C++ 遍历寻找指定进程,通过进程ID获取窗口句柄,以及HWND与CWnd之间转换

本文介绍如何使用C++遍历系统中所有窗口来查找指定进程,并演示了通过进程ID获取窗口句柄的方法。此外,还讲解了HWND与CWnd之间的转换技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

如题,如何遍历寻找指定进程?如何通过进程ID获取窗口句柄?HWND与CWnd之间是如何转换的?

解决:

1、HWND与CWnd之间的转换:使用 GetSafeHwndCWnd::FromHandle

// 已知 CWnd 获取 HWND
CWnd* pCWnd;
HWND hwnd = pCWnd->m_hWnd;
HWND hwnd1 = pCWnd->GetSafeHwnd();

// 已知 HWND 获取 CWnd
HWND hwnd2;
CWnd* pCwnd1 = CWnd::FromHandle(hwnd2);

2、如何遍历寻找指定进程:使用 EnumWindows

// 这里以匹配进程名称 Test Process 为例
::EnumWindows([](HWND hwnd, LPARAM lparam) ->BOOL {
	wchar_t winText[256];
	::GetWindowText(hwnd, winText, 255);
	CString winStr = winText;
	if (winStr.IsEmpty())
		return TRUE; //!< 继续遍历

	if(winStr.Compare(_T("Test Process")) == 0)
		return FALSE;//结束遍历
	
	return TRUE; //!< 继续遍历
}, NULL);

还可以加以判断是否是当前进程,寻找当前进程之外的指定进程:使用 _getpidGetWindowThreadProcessId

	//......
	if(winStr.Compare(_T("Test Process")) == 0)
	{
		DWORD dwId = 0;
		GetWindowThreadProcessId(hwnd, &dwId);
		if (_getpid() == dwId)
			return TRUE;// 是当前进程,继续遍历
		return FALSE;//结束遍历
	}
	//......

3、获取指定进程ID的窗口句柄:使用CALLBACKEnumWindowsstruct

//自定义枚举进程参数
typedef struct  
{
	HWND	hwnd;
	DWORD	processId;
}WindowsArg;

//回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam)
{
	WindowsArg * pArg = (WindowsArg *)lparam;

	DWORD dwId = 0;
	GetWindowThreadProcessId(hwnd, &dwId);
	if (pArg.processId == dwId)
	{
		pArg->hwnd = hwnd;
		return FALSE;//匹配进程ID成功,结束遍历
	}

	return TRUE; //!< 继续遍历
}

//通过进程ID获取窗口句柄
HWND GetHwndByProcessId(DWORD processId)
{
	HWND hwndRet = NULL;
	WindowsArg wa;
	wa.processId = processId;
	wa.hwnd = NULL;
	EnumWindows(EnumWindowsProc, (LPARAM)&wa);
	if (wa.hwnd)
		hwndRet = wa.hwnd;
	return hwndRet ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值