获取Windows 上应用窗口相关属性

最近项目经常需要获取应用程序窗口的详细信息,比如相对的位置、尺寸、窗口属性, 写了一个测试用的 DEMO  试试一些基本的获取

void CMFCApplication1Dlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码

        /** 根据窗口类名和标题名找到窗口,返回句柄**/ 
	HWND FF = ::FindWindowW(L"TXGuiFoundation", L"QQ");

	if ( FF == NULL )
	{
		return;
	}

	//000A03BE
	CString hwndStr;
	hwndStr.Format(L"%.8X",FF);
	AfxMessageBox(hwndStr);

	/** 获取窗口 相对屏幕位置信息 **/
	CString outText;
	RECT lpRect;
	if (::GetWindowRect(FF, &lpRect))
	{
		outText.Format(L"%d %d %d %d", lpRect.top, lpRect.left, lpRect.right, lpRect.bottom);
		AfxMessageBox(outText);
	}
	

	WINDOWPLACEMENT windowPlacement;
	if (::GetWindowPlacement(FF, &windowPlacement))
	{
		//https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/ns-winuser-windowplacement
		/**
			windowPlacement.rcNormalPosition.top;
			windowPlacement.rcNormalPosition.bottom;
			windowPlacement.rcNormalPosition.left;
			windowPlacement.rcNormalPosition.right;

			{LT(1386, 161) RB(1881, 631)  [495 x 470]}
		**/
		outText.Format( L"%d * %d", 
			windowPlacement.rcNormalPosition.bottom - windowPlacement.rcNormalPosition.top,
			windowPlacement.rcNormalPosition.right - windowPlacement.rcNormalPosition.left );
		AfxMessageBox(outText);
		
	}
	
	//
	WINDOWINFO windowInfo;
	if (::GetWindowInfo(FF, &windowInfo))
	{

		//https://docs.microsoft.com/zh-cn/windows/win32/winmsg/window-styles		
		//AfxMessageBox(outText);		
	}	

	
	/** 获取窗口隶属进程名 **/
	WCHAR filePath[MAX_PATH] = { 0 };
	DWORD pid;
	::GetWindowThreadProcessId(FF, &pid);	
	HANDLE pHandle  = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);	

	if (pHandle != NULL )
	{
		if (::GetModuleFileNameExW(pHandle, 0, filePath, sizeof(filePath)) > 0)
		{
			AfxMessageBox(filePath);
		}
	}	
	::CloseHandle(pHandle);

	/** 窗口文本 */
	WCHAR windowText[256] = { 0 };
	if (::GetWindowTextW(FF, windowText, 256) >= 0)
	{
		AfxMessageBox(windowText);
	}
	

	WCHAR className[256] = { 0 };
	if (::GetClassNameW(FF, className, 256) >=0 )
	{
		AfxMessageBox(className);
	}	

}