VC++ 获取窗口的类名和窗口所属进程线程id(附源码)

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++ 获取窗口的类名和窗口所属进程线程id(附源码)相关的知识,希望对你有一定的参考价值。

       我们可以调用系统API函数GetClassName获取窗口类名,调用GetWindowThreadProcessId获取窗口所属的进程和线程id。

 1、获取目标窗口的类名

       窗口的类名是调用RegisterClass接口向系统注册窗口类时设定的窗口类,窗口类可能是Windows系统预定义的通用类,比如win32编辑框窗口、对话框窗口等;窗口类也可能是我们自定义的窗口类,调用RegisterClass向系统注册的,如下:

 bool CWindowWnd::RegisterWindowClass()

	WNDCLASS wc =  0 ;
	wc.style = GetClassStyle();
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hIcon = NULL;
	wc.lpfnWndProc = CWindowWnd::__WndProc;
	wc.hInstance = CPaintManagerUI::GetInstance();
	wc.hCursor = ::LoadCursor( NULL, IDC_ARROW );
	wc.hbrBackground = NULL;
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = GetWindowClassName();
	ATOM ret = ::RegisterClass(&wc);
	ASSERT( ret != NULL || ::GetLastError() == ERROR_CLASS_ALREADY_EXISTS );
	return ret != NULL || ::GetLastError() == ERROR_CLASS_ALREADY_EXISTS;

     我们可以调用GetClassName获取类名:

TCHAR achClassName[MAX_PATH] =  0 ;
::GetClassName( hTargetWnd, achClassName, sizeof(achClassName)/sizeof(TCHAR) );

2、获取目标窗口所属的进程及线程id

       有时候我们需要判断某个窗口是属于哪个进程哪个线程的?Visual Studio自带的SPY++工具也可以获取到窗口所属进程和线程id。我们可以直接调用系统API接口GetWindowThreadProcessId去获取窗口所属进程和线程id,进程id通过参数返回,线程id通过函数的返回值返回:

DWORD dwWndProcessId = 0;
DWORD dwWndThraeadId = ::GetWindowThreadProcessId( hFocusWnd, &dwWndProcessId );

3、使用实例

     下面给出一个使用实例,我们通过类名去获取对应的窗口,然后判断是否是我们进程的窗口,如果是则做相应的处理:

// 解决组合框控件弹出下拉框时发起热键截图引起奔溃的问题,2014/02/21
HWND hFocusWnd = ::GetFocus();
TCHAR achClassName[MAX_PATH] =  0 ;
::GetClassName( hFocusWnd, achClassName, sizeof(achClassName)/sizeof(TCHAR) );
// 新增了摄像头控制窗口,该窗口在失去焦点后也会自动销毁,会影响截图的模态框,也要事先close掉,by 2015/11/18
if ( !_tcsicmp( achClassName, _T("ComboWnd") ) || !_tcsicmp( achClassName, _T("CCameraCtrlDlg") ) ) // 是组合框窗口

	DWORD dwWndProcessId = 0;
	DWORD dwWndThraeadId = ::GetWindowThreadProcessId( hFocusWnd, &dwWndProcessId );
	DWORD dwCurProcessId = ::GetCurrentProcessId();
	if ( dwWndProcessId == dwCurProcessId ) // 是本进程的窗口
	
		// 直接将组合框的弹出的下拉窗口关闭掉
		::SendMessage( hFocusWnd, WM_CLOSE, 0, 0 );
	

以上是关于VC++ 获取窗口的类名和窗口所属进程线程id(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

VC怎么通过进程ID得到窗口句柄

高分求解。VC++ 通过进程名或进程ID获取进程句柄

怎么查询一个进程ID,进程线程ID,进程句柄和进程线程句柄用来填充PROCESS_INFORMATION

一个进程有很多窗口,怎么取这个进程的下所有窗口句柄

delphi 知道路径和进程如何获取窗口句柄?

Vc++ mfc 窗口类名如何修改