|
@@ -0,0 +1,321 @@
|
|
|
|
+#include "Assist.h"
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+namespace Assist
|
|
|
|
+{
|
|
|
|
+ int frameWidth = 2;//6
|
|
|
|
+ int titleBarHeight = 27;//29
|
|
|
|
+
|
|
|
|
+ TCHAR g_szCurModuleFileName[MAX_PATH];
|
|
|
|
+ TCHAR g_szCurModuleDir[MAX_PATH];
|
|
|
|
+ TCHAR g_szCurModulePath[MAX_PATH];
|
|
|
|
+ TCHAR g_szFna[_MAX_FNAME];
|
|
|
|
+ TCHAR g_szExt[_MAX_EXT];
|
|
|
|
+ TCHAR g_szAssistConfig[MAX_PATH];
|
|
|
|
+ std::string g_strAppdir;
|
|
|
|
+ std::string g_strGameDir;
|
|
|
|
+ TCHAR g_szGameApp[MAX_PATH];
|
|
|
|
+ int nGameWndType;
|
|
|
|
+ int nAttackCount = 0;
|
|
|
|
+
|
|
|
|
+ void Init()
|
|
|
|
+ {
|
|
|
|
+ TCHAR szDrive[_MAX_DRIVE] = { 0 };
|
|
|
|
+ TCHAR szDir[_MAX_DIR] = { 0 };
|
|
|
|
+ TCHAR szFna[_MAX_FNAME] = { 0 };
|
|
|
|
+ TCHAR szExt[_MAX_EXT] = { 0 };
|
|
|
|
+ DWORD dwRet = ::GetModuleFileName(NULL, g_szCurModuleFileName, sizeof(g_szCurModuleFileName) / sizeof(TCHAR));
|
|
|
|
+
|
|
|
|
+ _tsplitpath_s(g_szCurModuleFileName, szDrive, szDir, g_szFna, g_szExt);
|
|
|
|
+ _tcscat_s(g_szCurModuleDir, MAX_PATH, szDrive);
|
|
|
|
+ _tcscat_s(g_szCurModuleDir, MAX_PATH, szDir);
|
|
|
|
+
|
|
|
|
+ //g_strAppdir = g_szCurModuleDir;
|
|
|
|
+ _stprintf_s(g_szAssistConfig, _T("%s%s"), g_szCurModuleDir, _T("Assist.ini"));
|
|
|
|
+
|
|
|
|
+ TCHAR szValue[MAX_PATH] = { 0 };
|
|
|
|
+ GetPrivateProfileString(_T("Assist"), _T("GamePath"), _T(""), szValue, MAX_PATH, g_szAssistConfig);
|
|
|
|
+ //g_strGameDir = szValue;
|
|
|
|
+ GetPrivateProfileString(_T("Assist"), _T("GameApp"), _T(""), g_szGameApp, MAX_PATH, g_szAssistConfig);
|
|
|
|
+
|
|
|
|
+ // 读取窗口类型;
|
|
|
|
+ _stprintf_s(szValue, _T("%s%s"), g_szGameApp, _T("save\\config.ini"));
|
|
|
|
+ int ScreenWidth = GetPrivateProfileInt(_T("SysCfg"), _T("ScreenWidth"), 640, szValue);
|
|
|
|
+
|
|
|
|
+ // Alt+A次数;
|
|
|
|
+ nAttackCount = GetPrivateProfileInt(_T("SysCfg"), _T("AttackCount"), 120, szValue);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void SetWindowForeground(HWND hWnd)
|
|
|
|
+ {
|
|
|
|
+ if (!IsWindow(hWnd))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ ::ShowWindow(hWnd, SW_SHOWNORMAL);
|
|
|
|
+ ::SetForegroundWindow(hWnd); // 窗口前置才能单击成功;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bool IsWindowForeground(HWND hWnd)
|
|
|
|
+ {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bool StartApp(const TCHAR* szAppPath, const TCHAR* szAppArgs)
|
|
|
|
+ {
|
|
|
|
+ if (!PathFileExists(szAppPath))
|
|
|
|
+ {
|
|
|
|
+ printf("Error, %ls path not exists!\n", szAppPath);
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ SHELLEXECUTEINFO ShExecInfo;
|
|
|
|
+ ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
|
|
|
|
+ ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
|
|
|
|
+ ShExecInfo.hwnd = NULL;
|
|
|
|
+ ShExecInfo.lpVerb = _T("open");
|
|
|
|
+ ShExecInfo.lpFile = szAppPath;
|
|
|
|
+ ShExecInfo.lpParameters = szAppArgs;
|
|
|
|
+ ShExecInfo.lpDirectory = NULL;
|
|
|
|
+ ShExecInfo.nShow = SW_SHOW;
|
|
|
|
+ ShExecInfo.hInstApp = NULL;
|
|
|
|
+
|
|
|
|
+ if (ShellExecuteEx(&ShExecInfo))
|
|
|
|
+ {
|
|
|
|
+ CloseHandle(ShExecInfo.hProcess);
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void CloseProcess(LPCTSTR lpProcessName)
|
|
|
|
+ {
|
|
|
|
+ PROCESSENTRY32 pe32 = { 0 };
|
|
|
|
+ HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
|
|
+ if (hProcessSnap == NULL) return;
|
|
|
|
+
|
|
|
|
+ // 遍历进程;
|
|
|
|
+ pe32.dwSize = sizeof(PROCESSENTRY32);
|
|
|
|
+ for (BOOL bRet = Process32First(hProcessSnap, &pe32); bRet; bRet = Process32Next(hProcessSnap, &pe32)) {
|
|
|
|
+ if (_tcscmp(lpProcessName, pe32.szExeFile) == 0) {
|
|
|
|
+ HANDLE hProc = ::OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
|
|
|
|
+ TerminateProcess(hProc, 4);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ CloseHandle(hProcessSnap);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 返回第一个找到的进程pid
|
|
|
|
+ DWORD GetProcessId(LPCTSTR lpProcessName)
|
|
|
|
+ {
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void GetAllProcessId(std::vector<DWORD>& vtPid, LPCTSTR lpProcessName)
|
|
|
|
+ {
|
|
|
|
+ vtPid.clear();
|
|
|
|
+ PROCESSENTRY32 pe32 = { 0 };
|
|
|
|
+
|
|
|
|
+ HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
|
|
+ if (hProcessSnap == NULL) return;
|
|
|
|
+
|
|
|
|
+ // 遍历进程;
|
|
|
|
+ pe32.dwSize = sizeof(PROCESSENTRY32);
|
|
|
|
+ for (BOOL bRet = Process32First(hProcessSnap, &pe32); bRet; bRet = Process32Next(hProcessSnap, &pe32)) {
|
|
|
|
+ if (_tcscmp(lpProcessName, pe32.szExeFile) == 0) {
|
|
|
|
+ vtPid.push_back(pe32.th32ProcessID);
|
|
|
|
+
|
|
|
|
+ GetClassNameWnd(pe32.th32ProcessID, _T("Intermediate D3D Window"));
|
|
|
|
+ GetWindowNameWnd(pe32.th32ProcessID, _T("Feishu Rooms"));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ CloseHandle(hProcessSnap);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ HWND GetProcessMainWnd(const DWORD& dwTagetProcessId, LPCTSTR lpTagetWndName)
|
|
|
|
+ {
|
|
|
|
+ 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 GetProcessMainWnd(LPCTSTR lpProcessName, LPCTSTR lpTagetWndName)
|
|
|
|
+ {
|
|
|
|
+ HWND hTagetWnd = NULL;
|
|
|
|
+ DWORD dwProcessId = 0;
|
|
|
|
+ if ((dwProcessId = GetProcessId(lpProcessName)) != 0) {
|
|
|
|
+ hTagetWnd = GetProcessMainWnd(dwProcessId, lpTagetWndName);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return hTagetWnd;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ HWND GetClassNameWnd(const DWORD& dwTagetProcessId, LPCTSTR lpTagetClassName)
|
|
|
|
+ {
|
|
|
|
+ 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 (lpTagetClassName == 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(szClassName, lpTagetClassName) != NULL) {
|
|
|
|
+ hTagetProcessWnd = hCurWnd;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return hTagetProcessWnd;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ HWND GetWindowNameWnd(const DWORD& dwTagetProcessId, LPCTSTR lpTagetWindowName)
|
|
|
|
+ {
|
|
|
|
+ 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 (lpTagetWindowName == 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, lpTagetWindowName) != NULL) {
|
|
|
|
+ hTagetProcessWnd = hCurWnd;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return hTagetProcessWnd;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ HWND GetWindowNameWnd(LPCTSTR lpProcessName, LPCTSTR lpTagetWindowName)
|
|
|
|
+ {
|
|
|
|
+ HWND hTagWnd = NULL;
|
|
|
|
+ PROCESSENTRY32 pe32 = { 0 };
|
|
|
|
+ HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
|
|
+ if (hProcessSnap == NULL) return NULL;
|
|
|
|
+
|
|
|
|
+ // 遍历进程;
|
|
|
|
+ pe32.dwSize = sizeof(PROCESSENTRY32);
|
|
|
|
+ for (BOOL bRet = Process32First(hProcessSnap, &pe32); bRet; bRet = Process32Next(hProcessSnap, &pe32)) {
|
|
|
|
+ if (_tcscmp(lpProcessName, pe32.szExeFile) == 0) {
|
|
|
|
+ hTagWnd = GetWindowNameWnd(pe32.th32ProcessID, lpTagetWindowName);
|
|
|
|
+ if (hTagWnd != NULL)
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ CloseHandle(hProcessSnap);
|
|
|
|
+
|
|
|
|
+ return hTagWnd;
|
|
|
|
+ }
|
|
|
|
+};
|