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(附源码)的主要内容,如果未能解决你的问题,请参考以下文章