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

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

VC++ 获取窗口的类名和窗口所属进程线程id(附源码)_第1张图片

 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,进程id)