Kaynağa Gözat

进程函数相关修改

Jeff 4 yıl önce
ebeveyn
işleme
b33eb58de8

+ 54 - 19
GameAssist/GameAssist/Assist.cpp

@@ -23,7 +23,7 @@ namespace GAssist
 	std::string g_strGameDir;
 	TCHAR g_szGameApp[MAX_PATH];
 	std::map<byte, byte> vsKey;
-	std::vector<GWnd> g_vtGWnd;
+	std::vector<GameWndInfo> g_vtGameWndInfo;
 	int nGameWndType;
 
 	void Init()
@@ -337,32 +337,67 @@ namespace GAssist
 		return hTagetProcessWnd;
 	}
 
-	void GetAllProcessMainWnd(const std::vector<DWORD>& vtPid, std::vector<GWnd>& vtGWnd)
+	void GetAllProcessMainWnd(const std::vector<DWORD>& vtPid, std::vector<GameWndInfo>& vtGWnd, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)
 	{
-		// 删除已失效的进程;
-		for (std::vector<GWnd>::iterator it = vtGWnd.begin(); it != vtGWnd.end();)
+		DWORD dwCurPorcessId = 0;
+		HWND hTagetProcessWnd = NULL;
+		TCHAR szWndName[MAX_PATH] = { 0 };
+		TCHAR szClassName[MAX_PATH] = { 0 };
+		TCHAR szRoleName[MAX_PATH] = { 0 };
+		// 清空队列;
+		vtGWnd.clear();
+		for ( std::vector<DWORD>::const_iterator it = vtPid.begin(); it != vtPid.end(); it++ )
 		{
-			BOOL bExit = FALSE;
-			for (std::vector<DWORD>::const_iterator it_pid = vtPid.begin(); it_pid != vtPid.end(); it_pid++ )
-			{
-				if (*it_pid == it->lProcId)
-					bExit = TRUE;
+			// 取得第一个窗口句柄;
+			for (HWND hCurWnd = ::GetTopWindow(NULL); hCurWnd != NULL; hCurWnd = ::GetNextWindow(hCurWnd, GW_HWNDNEXT)) {
+				// 重置为0;
+				dwCurPorcessId = 0;
+				// 通过窗口句柄反查进程pid;
+				DWORD dwThreadId = ::GetWindowThreadProcessId(hCurWnd, &dwCurPorcessId);
+				if (dwThreadId != 0) {
+					// 判断当前进程id是否和目标进程id相同;
+					if (dwCurPorcessId == *it) {
+						if (lpTagetWndName == NULL) {
+							hTagetProcessWnd = hCurWnd;
+							break;
+						}
+						else {
+							// 获取窗口名称;
+							::GetWindowText(hCurWnd, szWndName, sizeof(szWndName) / sizeof(TCHAR));
+							// 获取窗口类名;
+							::GetClassName(hCurWnd, szClassName, sizeof(szClassName) / sizeof(TCHAR));
+#ifdef _DEBUG
+							TCHAR szLogMsg[MAX_PATH] = { 0 };
+							_stprintf_s(szLogMsg, _T("类名:%s, 窗口名:%s,窗口地址:%p \n"), szClassName, szWndName, hCurWnd);
+							OutputDebugString(szLogMsg);
+#endif
+							if (_tcsstr(szWndName, lpTagetWndName) != NULL) {
+								hTagetProcessWnd = hCurWnd;
+								break;
+							}
+						}
+					}
+				}
 			}
 
-			if (!bExit)
-			{
-				it = vtGWnd.erase(it);
+			// 当前窗口有可能不是进程父窗口;
+			HWND hParentWnd = hTagetProcessWnd;
+			while (hParentWnd) {
+				hParentWnd = ::GetParent(hTagetProcessWnd);
+				if (hParentWnd == NULL)
+					break;
+				hTagetProcessWnd = hParentWnd;
 			}
-			else
+
+			if (hTagetProcessWnd)
 			{
-				it++;
+				GameWndInfo gameInfo;
+				gameInfo.hWnd = hTagetProcessWnd;
+				gameInfo.lProcId = *it;
+				gameInfo.strWndText = szRoleName;
+				vtGWnd.push_back(gameInfo);
 			}
 		}
-
-		for ( std::vector<DWORD>::const_iterator it = vtPid.begin(); it != vtPid.end(); it++ )
-		{
-			HWND hGWnd = GetProcessMainWnd(*it);
-		}
 	}
 
 	HWND GetProcessMainWnd(LPCTSTR lpProcessName /* = _T("Game.exe") */, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)

+ 4 - 4
GameAssist/GameAssist/Assist.h

@@ -109,13 +109,13 @@ namespace GAssist
 
 	extern std::vector<GameHwnd> g_vtGameHwnd;
 
-	typedef struct __GWND__
+	typedef struct __GAMEWNDINFO__
 	{
 		unsigned long       lProcId;				// 进程ID;
 		HWND                hWnd;					// 进程窗口句柄;
 		std::string			strWndText;				// 窗口名称;
-	}GWnd, * pGWnd;
-	extern std::vector<GWnd> g_vtGWnd;
+	}GameWndInfo, * pGameWndInfo;
+	extern std::vector<GameWndInfo> g_vtGameWndInfo;
 
 	typedef struct __GAC__ {
 		bool				bLogin;                 // 登录状态;
@@ -154,7 +154,7 @@ namespace GAssist
 	extern void GetAllProcessId(std::vector<DWORD> &vtPid, LPCTSTR lpProcessName = _T("Game.exe"));
 	// 根据进程pid获取进程对应程序的窗口句柄;
 	extern HWND GetProcessMainWnd(const DWORD &dwTagetProcessId, LPCTSTR lpTagetWndName = _T("大话水浒"));
-	extern void GetAllProcessMainWnd(const std::vector<DWORD> &vtPid, std::vector<GWnd> &vtGWnd);
+	extern void GetAllProcessMainWnd(const std::vector<DWORD> &vtPid, std::vector<GameWndInfo> &vtGWnd, LPCTSTR lpTagetWndName = _T("大话水浒"));
 	extern HWND GetProcessMainWnd(LPCTSTR lpProcessName = _T("Game.exe"), LPCTSTR lpTagetWndName = _T("大话水浒"));
 
 

+ 6 - 1
GameAssist/GameAssist/GameAssist.cpp

@@ -322,9 +322,14 @@ BOOL CGameAssistApp::InitInstance()
 	HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
 #endif
 
-
 	GAssist::IsWin10DpiScaleEanbled();
 
+#if 1
+	std::vector<DWORD> vtPID;
+	GAssist::GetAllProcessId(vtPID);
+	GAssist::GetAllProcessMainWnd(vtPID, GAssist::g_vtGameWndInfo);
+#endif
+
 	// 标准初始化
 	// 如果未使用这些功能并希望减小
 	// 最终可执行文件的大小,则应移除下列