|
@@ -162,89 +162,7 @@ namespace GAssist
|
|
|
free(old_locale);//还原区域设定;
|
|
|
}
|
|
|
|
|
|
- // 根据路径名查找进程,返回进程ID;
|
|
|
- DWORD FindProcess(IN LPCSTR lpProName)
|
|
|
- {
|
|
|
- DWORD dwProcessID = 0;
|
|
|
- PROCESSENTRY32 pe32 = { 0 };
|
|
|
-
|
|
|
- HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
|
- if (hProcessSnap == NULL)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- pe32.dwSize = sizeof(PROCESSENTRY32);
|
|
|
-
|
|
|
- if (Process32First(hProcessSnap, &pe32)) {
|
|
|
- do {
|
|
|
- if (_tcscmp(lpProName, pe32.szExeFile) == 0) {
|
|
|
- dwProcessID = pe32.th32ProcessID;
|
|
|
- break;
|
|
|
- }
|
|
|
- } while (Process32Next(hProcessSnap, &pe32));
|
|
|
- }
|
|
|
- CloseHandle(hProcessSnap);
|
|
|
-
|
|
|
- return dwProcessID;
|
|
|
- }
|
|
|
-
|
|
|
- // 注意:一个进程可能拥有多个独立的窗口句柄;
|
|
|
- HWND GetProMainHwnd(DWORD dwProcessId)
|
|
|
- {
|
|
|
- DWORD dwPID = 0;
|
|
|
- HWND hwndRet = NULL;
|
|
|
- TCHAR szName[MAX_PATH] = { 0 };
|
|
|
- TCHAR szClass[MAX_PATH] = { 0 };
|
|
|
- TCHAR szLogMsg[MAX_PATH] = { 0 };
|
|
|
- // 取得第一个窗口句柄
|
|
|
- HWND hwndWindow = ::GetTopWindow(NULL);
|
|
|
- // 遍历出结果窗口;
|
|
|
- while (hwndWindow) {
|
|
|
- dwPID = 0;
|
|
|
- // 通过窗口句柄取得进程ID
|
|
|
- DWORD dwTheardID = ::GetWindowThreadProcessId(hwndWindow, &dwPID);
|
|
|
- if (dwTheardID != 0) {
|
|
|
- // 判断和参数传入的进程ID是否相等
|
|
|
- if (dwPID == dwProcessId) {
|
|
|
- // 进程ID相等,则记录窗口句柄
|
|
|
- hwndRet = hwndWindow;
|
|
|
- // 获取窗口类名,标题名;
|
|
|
- ::GetWindowText(hwndRet, szName, sizeof(szName) / sizeof(TCHAR));
|
|
|
- ::GetClassName(hwndRet, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类
|
|
|
-
|
|
|
- TRACE3(_T("类名:%s 标题:%s 地址%p\n"), szClass, szName, hwndRet);
|
|
|
-
|
|
|
- // 是否找到目前窗口;
|
|
|
- if (_tcsstr(szName, _T("大话水浒")))
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- // 取得下一个窗口句柄
|
|
|
- hwndWindow = ::GetNextWindow(hwndWindow, GW_HWNDNEXT);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 上面取得的窗口,不一定是最上层的窗口,需要通过GetParent获取最顶层窗口
|
|
|
- HWND hwndWindowParent = NULL;
|
|
|
- // 循环查找父窗口,以便保证返回的句柄是最顶层的窗口句柄
|
|
|
- while (hwndRet != NULL) {
|
|
|
- ::GetWindowText(hwndRet, szName, sizeof(szName) / sizeof(TCHAR));
|
|
|
- ::GetClassName(hwndRet, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类
|
|
|
- //TRACE3(_T("%s %s %s"), szClass, szName, "\n");
|
|
|
- _stprintf_s(szLogMsg, _T("类名:%s, 窗口名:%s,窗口地址:%p \n"), szClass, szName, hwndRet);
|
|
|
- OutputDebugString(szLogMsg);
|
|
|
-
|
|
|
- hwndWindowParent = ::GetParent(hwndRet);
|
|
|
- if (hwndWindowParent == NULL) {
|
|
|
- break;
|
|
|
- }
|
|
|
- hwndRet = hwndWindowParent;
|
|
|
- }
|
|
|
- // 返回窗口句柄
|
|
|
- return hwndRet;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+ // 返回第一个找到的进程ID;
|
|
|
DWORD GetProcessId(LPCTSTR lpProcessName /* = _T("Game.exe") */)
|
|
|
{
|
|
|
DWORD dwProcessId = 0;
|
|
@@ -286,6 +204,7 @@ namespace GAssist
|
|
|
CloseHandle(hProcessSnap);
|
|
|
}
|
|
|
|
|
|
+ // 注意:一个进程可能拥有多个独立的窗口,所以要根据窗口名找具体窗口句柄;
|
|
|
HWND GetProcessMainWnd(const DWORD& dwTagetProcessId, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)
|
|
|
{
|
|
|
DWORD dwCurPorcessId = 0;
|
|
@@ -464,7 +383,7 @@ namespace GAssist
|
|
|
ShellExecute(NULL, "open", GAssist::g_szGameApp, NULL, NULL, SW_SHOWNORMAL);//SW_HIDE无用,因为会自动结;
|
|
|
Sleep(1500); // Main.exe设置了陷阱(自己再开启了一个进程,结束上一个进程),需要等1.5秒;
|
|
|
|
|
|
- DWORD dwProcId = GAssist::FindProcess(_T("Main.exe"));
|
|
|
+ DWORD dwProcId = GAssist::GetProcessId(_T("Main.exe"));
|
|
|
if (dwProcId <= 0)
|
|
|
return;
|
|
|
|