|
@@ -243,6 +243,91 @@ namespace GAssist
|
|
|
return hwndRet;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ DWORD GetProcessId(LPCTSTR lpProcessName /* = _T("Game.exe") */)
|
|
|
+ {
|
|
|
+ DWORD dwProcessId = 0;
|
|
|
+ PROCESSENTRY32 pe32 = { 0 };
|
|
|
+
|
|
|
+ HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
|
+ if ( hProcessSnap == NULL ) return 0;
|
|
|
+
|
|
|
+ // 遍历进程;
|
|
|
+ pe32.dwSize = sizeof(PROCESSENTRY32);
|
|
|
+ for ( BOOL bRet = Process32First(hProcessSnap, &pe32); bRet; bRet = Process32Next(hProcessSnap, &pe32) ) {
|
|
|
+ if ( _tcscmp(lpProcessName, pe32.szExeFile) == 0 ) {
|
|
|
+ dwProcessId = pe32.th32ProcessID;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ CloseHandle(hProcessSnap);
|
|
|
+
|
|
|
+ return dwProcessId;
|
|
|
+ }
|
|
|
+
|
|
|
+ HWND GetProcessWnd(const DWORD &dwTagetProcessId, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)
|
|
|
+ {
|
|
|
+ DWORD dwCurPorcessId = 0;
|
|
|
+ HWND hTagetProcessWnd = NULL;
|
|
|
+ TCHAR szWndName[MAX_PATH] = { 0 };
|
|
|
+ TCHAR szClassName[MAX_PATH] = { 0 };
|
|
|
+
|
|
|
+ // 取得第一个窗口句柄;
|
|
|
+ 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 == dwTagetProcessId ) {
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 当前窗口有可能不是进程父窗口;
|
|
|
+ HWND hParentWnd = hTagetProcessWnd;
|
|
|
+ while ( hParentWnd ) {
|
|
|
+ hParentWnd = ::GetParent(hTagetProcessWnd);
|
|
|
+ if ( hParentWnd == NULL )
|
|
|
+ break;
|
|
|
+ hTagetProcessWnd = hParentWnd;
|
|
|
+ }
|
|
|
+
|
|
|
+ return hTagetProcessWnd;
|
|
|
+ }
|
|
|
+
|
|
|
+ HWND GetProcessWnd(LPCTSTR lpProcessName /* = _T("Game.exe") */, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)
|
|
|
+ {
|
|
|
+ HWND hTagetWnd = NULL;
|
|
|
+ DWORD dwProcessId = 0;
|
|
|
+ if ( (dwProcessId = GetProcessId(lpProcessName)) != 0 ) {
|
|
|
+ hTagetWnd = GetProcessWnd(dwProcessId, lpTagetWndName);
|
|
|
+ }
|
|
|
+
|
|
|
+ return hTagetWnd;
|
|
|
+ }
|
|
|
+
|
|
|
std::vector<GameHwnd> g_vtGameHwnd;
|
|
|
BOOL CALLBACK EnumChildWindowCallBack(HWND hWnd, LPARAM lParam)
|
|
|
{
|