|
@@ -23,7 +23,7 @@ namespace GAssist
|
|
std::string g_strGameDir;
|
|
std::string g_strGameDir;
|
|
TCHAR g_szGameApp[MAX_PATH];
|
|
TCHAR g_szGameApp[MAX_PATH];
|
|
std::map<byte, byte> vsKey;
|
|
std::map<byte, byte> vsKey;
|
|
- std::vector<GWnd> g_vtGWnd;
|
|
|
|
|
|
+ std::vector<GameWndInfo> g_vtGameWndInfo;
|
|
int nGameWndType;
|
|
int nGameWndType;
|
|
|
|
|
|
void Init()
|
|
void Init()
|
|
@@ -337,32 +337,67 @@ namespace GAssist
|
|
return hTagetProcessWnd;
|
|
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("大话水浒") */)
|
|
HWND GetProcessMainWnd(LPCTSTR lpProcessName /* = _T("Game.exe") */, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)
|