|
@@ -113,7 +113,7 @@ namespace GAssist
|
|
|
|
|
|
void GetGameConfig()
|
|
void GetGameConfig()
|
|
{
|
|
{
|
|
- TCHAR szValue[MAX_PATH] = {0};
|
|
|
|
|
|
+ TCHAR szValue[MAX_PATH] = { 0 };
|
|
GetPrivateProfileString(_T("Assist"), _T("GamePath"), _T(""), szValue, MAX_PATH, g_szAssistConfig);
|
|
GetPrivateProfileString(_T("Assist"), _T("GamePath"), _T(""), szValue, MAX_PATH, g_szAssistConfig);
|
|
g_strGameDir = szValue;
|
|
g_strGameDir = szValue;
|
|
GetPrivateProfileString(_T("Assist"), _T("GameApp"), _T(""), g_szGameApp, MAX_PATH, g_szAssistConfig);
|
|
GetPrivateProfileString(_T("Assist"), _T("GameApp"), _T(""), g_szGameApp, MAX_PATH, g_szAssistConfig);
|
|
@@ -192,9 +192,9 @@ namespace GAssist
|
|
{
|
|
{
|
|
DWORD dwPID = 0;
|
|
DWORD dwPID = 0;
|
|
HWND hwndRet = NULL;
|
|
HWND hwndRet = NULL;
|
|
- TCHAR szName[MAX_PATH] = {0};
|
|
|
|
- TCHAR szClass[MAX_PATH] = {0};
|
|
|
|
- TCHAR szLogMsg[MAX_PATH] = {0};
|
|
|
|
|
|
+ TCHAR szName[MAX_PATH] = { 0 };
|
|
|
|
+ TCHAR szClass[MAX_PATH] = { 0 };
|
|
|
|
+ TCHAR szLogMsg[MAX_PATH] = { 0 };
|
|
// 取得第一个窗口句柄
|
|
// 取得第一个窗口句柄
|
|
HWND hwndWindow = ::GetTopWindow(NULL);
|
|
HWND hwndWindow = ::GetTopWindow(NULL);
|
|
// 遍历出结果窗口;
|
|
// 遍历出结果窗口;
|
|
@@ -210,11 +210,11 @@ namespace GAssist
|
|
// 获取窗口类名,标题名;
|
|
// 获取窗口类名,标题名;
|
|
::GetWindowText(hwndRet, szName, sizeof(szName) / sizeof(TCHAR));
|
|
::GetWindowText(hwndRet, szName, sizeof(szName) / sizeof(TCHAR));
|
|
::GetClassName(hwndRet, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类
|
|
::GetClassName(hwndRet, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类
|
|
-
|
|
|
|
|
|
+
|
|
TRACE3(_T("类名:%s 标题:%s 地址%p\n"), szClass, szName, hwndRet);
|
|
TRACE3(_T("类名:%s 标题:%s 地址%p\n"), szClass, szName, hwndRet);
|
|
|
|
|
|
// 是否找到目前窗口;
|
|
// 是否找到目前窗口;
|
|
- if ( _tcsstr(szName, _T("大话水浒")) )
|
|
|
|
|
|
+ if (_tcsstr(szName, _T("大话水浒")))
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -222,7 +222,7 @@ namespace GAssist
|
|
hwndWindow = ::GetNextWindow(hwndWindow, GW_HWNDNEXT);
|
|
hwndWindow = ::GetNextWindow(hwndWindow, GW_HWNDNEXT);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+
|
|
// 上面取得的窗口,不一定是最上层的窗口,需要通过GetParent获取最顶层窗口
|
|
// 上面取得的窗口,不一定是最上层的窗口,需要通过GetParent获取最顶层窗口
|
|
HWND hwndWindowParent = NULL;
|
|
HWND hwndWindowParent = NULL;
|
|
// 循环查找父窗口,以便保证返回的句柄是最顶层的窗口句柄
|
|
// 循环查找父窗口,以便保证返回的句柄是最顶层的窗口句柄
|
|
@@ -243,19 +243,19 @@ namespace GAssist
|
|
return hwndRet;
|
|
return hwndRet;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+
|
|
DWORD GetProcessId(LPCTSTR lpProcessName /* = _T("Game.exe") */)
|
|
DWORD GetProcessId(LPCTSTR lpProcessName /* = _T("Game.exe") */)
|
|
{
|
|
{
|
|
DWORD dwProcessId = 0;
|
|
DWORD dwProcessId = 0;
|
|
PROCESSENTRY32 pe32 = { 0 };
|
|
PROCESSENTRY32 pe32 = { 0 };
|
|
|
|
|
|
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
- if ( hProcessSnap == NULL ) return 0;
|
|
|
|
|
|
+ if (hProcessSnap == NULL) return 0;
|
|
|
|
|
|
// 遍历进程;
|
|
// 遍历进程;
|
|
pe32.dwSize = sizeof(PROCESSENTRY32);
|
|
pe32.dwSize = sizeof(PROCESSENTRY32);
|
|
- for ( BOOL bRet = Process32First(hProcessSnap, &pe32); bRet; bRet = Process32Next(hProcessSnap, &pe32) ) {
|
|
|
|
- if ( _tcscmp(lpProcessName, pe32.szExeFile) == 0 ) {
|
|
|
|
|
|
+ for (BOOL bRet = Process32First(hProcessSnap, &pe32); bRet; bRet = Process32Next(hProcessSnap, &pe32)) {
|
|
|
|
+ if (_tcscmp(lpProcessName, pe32.szExeFile) == 0) {
|
|
dwProcessId = pe32.th32ProcessID;
|
|
dwProcessId = pe32.th32ProcessID;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -266,7 +266,7 @@ namespace GAssist
|
|
return dwProcessId;
|
|
return dwProcessId;
|
|
}
|
|
}
|
|
|
|
|
|
- HWND GetProcessMainWnd(const DWORD &dwTagetProcessId, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)
|
|
|
|
|
|
+ HWND GetProcessMainWnd(const DWORD& dwTagetProcessId, LPCTSTR lpTagetWndName /* = _T("大话水浒") */)
|
|
{
|
|
{
|
|
DWORD dwCurPorcessId = 0;
|
|
DWORD dwCurPorcessId = 0;
|
|
HWND hTagetProcessWnd = NULL;
|
|
HWND hTagetProcessWnd = NULL;
|
|
@@ -274,29 +274,29 @@ namespace GAssist
|
|
TCHAR szClassName[MAX_PATH] = { 0 };
|
|
TCHAR szClassName[MAX_PATH] = { 0 };
|
|
|
|
|
|
// 取得第一个窗口句柄;
|
|
// 取得第一个窗口句柄;
|
|
- for ( HWND hCurWnd = ::GetTopWindow(NULL); hCurWnd != NULL; hCurWnd = ::GetNextWindow(hCurWnd, GW_HWNDNEXT) ) {
|
|
|
|
|
|
+ for (HWND hCurWnd = ::GetTopWindow(NULL); hCurWnd != NULL; hCurWnd = ::GetNextWindow(hCurWnd, GW_HWNDNEXT)) {
|
|
// 重置为0;
|
|
// 重置为0;
|
|
dwCurPorcessId = 0;
|
|
dwCurPorcessId = 0;
|
|
// 通过窗口句柄反查进程pid;
|
|
// 通过窗口句柄反查进程pid;
|
|
DWORD dwThreadId = ::GetWindowThreadProcessId(hCurWnd, &dwCurPorcessId);
|
|
DWORD dwThreadId = ::GetWindowThreadProcessId(hCurWnd, &dwCurPorcessId);
|
|
- if ( dwThreadId != 0 ) {
|
|
|
|
|
|
+ if (dwThreadId != 0) {
|
|
// 判断当前进程id是否和目标进程id相同;
|
|
// 判断当前进程id是否和目标进程id相同;
|
|
- if ( dwCurPorcessId == dwTagetProcessId ) {
|
|
|
|
- if ( lpTagetWndName == NULL ) {
|
|
|
|
|
|
+ if (dwCurPorcessId == dwTagetProcessId) {
|
|
|
|
+ if (lpTagetWndName == NULL) {
|
|
hTagetProcessWnd = hCurWnd;
|
|
hTagetProcessWnd = hCurWnd;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- else{
|
|
|
|
|
|
+ else {
|
|
// 获取窗口名称;
|
|
// 获取窗口名称;
|
|
- ::GetWindowText(hCurWnd, szWndName, sizeof(szWndName)/sizeof(TCHAR));
|
|
|
|
|
|
+ ::GetWindowText(hCurWnd, szWndName, sizeof(szWndName) / sizeof(TCHAR));
|
|
// 获取窗口类名;
|
|
// 获取窗口类名;
|
|
- ::GetClassName(hCurWnd, szClassName, sizeof(szClassName)/sizeof(TCHAR));
|
|
|
|
|
|
+ ::GetClassName(hCurWnd, szClassName, sizeof(szClassName) / sizeof(TCHAR));
|
|
#ifdef _DEBUG
|
|
#ifdef _DEBUG
|
|
- TCHAR szLogMsg[MAX_PATH] = {0};
|
|
|
|
|
|
+ TCHAR szLogMsg[MAX_PATH] = { 0 };
|
|
_stprintf_s(szLogMsg, _T("类名:%s, 窗口名:%s,窗口地址:%p \n"), szClassName, szWndName, hCurWnd);
|
|
_stprintf_s(szLogMsg, _T("类名:%s, 窗口名:%s,窗口地址:%p \n"), szClassName, szWndName, hCurWnd);
|
|
OutputDebugString(szLogMsg);
|
|
OutputDebugString(szLogMsg);
|
|
#endif
|
|
#endif
|
|
- if ( _tcsstr(szWndName, lpTagetWndName) != NULL ) {
|
|
|
|
|
|
+ if (_tcsstr(szWndName, lpTagetWndName) != NULL) {
|
|
hTagetProcessWnd = hCurWnd;
|
|
hTagetProcessWnd = hCurWnd;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -307,9 +307,9 @@ namespace GAssist
|
|
|
|
|
|
// 当前窗口有可能不是进程父窗口;
|
|
// 当前窗口有可能不是进程父窗口;
|
|
HWND hParentWnd = hTagetProcessWnd;
|
|
HWND hParentWnd = hTagetProcessWnd;
|
|
- while ( hParentWnd ) {
|
|
|
|
|
|
+ while (hParentWnd) {
|
|
hParentWnd = ::GetParent(hTagetProcessWnd);
|
|
hParentWnd = ::GetParent(hTagetProcessWnd);
|
|
- if ( hParentWnd == NULL )
|
|
|
|
|
|
+ if (hParentWnd == NULL)
|
|
break;
|
|
break;
|
|
hTagetProcessWnd = hParentWnd;
|
|
hTagetProcessWnd = hParentWnd;
|
|
}
|
|
}
|
|
@@ -321,23 +321,23 @@ namespace GAssist
|
|
{
|
|
{
|
|
HWND hTagetWnd = NULL;
|
|
HWND hTagetWnd = NULL;
|
|
DWORD dwProcessId = 0;
|
|
DWORD dwProcessId = 0;
|
|
- if ( (dwProcessId = GetProcessId(lpProcessName)) != 0 ) {
|
|
|
|
|
|
+ if ((dwProcessId = GetProcessId(lpProcessName)) != 0) {
|
|
hTagetWnd = GetProcessMainWnd(dwProcessId, lpTagetWndName);
|
|
hTagetWnd = GetProcessMainWnd(dwProcessId, lpTagetWndName);
|
|
}
|
|
}
|
|
|
|
|
|
return hTagetWnd;
|
|
return hTagetWnd;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
std::vector<GameHwnd> g_vtGameHwnd;
|
|
std::vector<GameHwnd> g_vtGameHwnd;
|
|
- BOOL CALLBACK EnumChildWindowCallBack(HWND hWnd, LPARAM lParam)
|
|
|
|
- {
|
|
|
|
- DWORD dwPid = 0;
|
|
|
|
|
|
+ BOOL CALLBACK EnumChildWindowCallBack(HWND hWnd, LPARAM lParam)
|
|
|
|
+ {
|
|
|
|
+ DWORD dwPid = 0;
|
|
GetWindowThreadProcessId(hWnd, &dwPid); // 获得找到窗口所属的进程
|
|
GetWindowThreadProcessId(hWnd, &dwPid); // 获得找到窗口所属的进程
|
|
if (dwPid == lParam) // 判断是否是目标进程的窗口
|
|
if (dwPid == lParam) // 判断是否是目标进程的窗口
|
|
- {
|
|
|
|
- TCHAR szName[MAX_PATH] = {0};
|
|
|
|
- TCHAR szClass[MAX_PATH] = {0};
|
|
|
|
- TCHAR szLogMsg[MAX_PATH] = {0};
|
|
|
|
|
|
+ {
|
|
|
|
+ TCHAR szName[MAX_PATH] = { 0 };
|
|
|
|
+ TCHAR szClass[MAX_PATH] = { 0 };
|
|
|
|
+ TCHAR szLogMsg[MAX_PATH] = { 0 };
|
|
::GetWindowText(hWnd, szName, sizeof(szName) / sizeof(TCHAR));
|
|
::GetWindowText(hWnd, szName, sizeof(szName) / sizeof(TCHAR));
|
|
::GetClassName(hWnd, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类
|
|
::GetClassName(hWnd, szClass, sizeof(szClass) / sizeof(TCHAR)); // 窗口类
|
|
DWORD dwId = ::GetDlgCtrlID(hWnd);
|
|
DWORD dwId = ::GetDlgCtrlID(hWnd);
|
|
@@ -352,19 +352,19 @@ namespace GAssist
|
|
ghwnd.strClassName = szClass;
|
|
ghwnd.strClassName = szClass;
|
|
g_vtGameHwnd.push_back(ghwnd);
|
|
g_vtGameHwnd.push_back(ghwnd);
|
|
|
|
|
|
- _tprintf_s(_T("0x%08X ") , hWnd); // 输出窗口信息
|
|
|
|
- TCHAR buf[MAX_PATH];
|
|
|
|
- SendMessage(hWnd, WM_GETTEXT, MAX_PATH, (LPARAM)buf);
|
|
|
|
- _tprintf_s(_T("%s/n") , buf);
|
|
|
|
|
|
+ _tprintf_s(_T("0x%08X "), hWnd); // 输出窗口信息
|
|
|
|
+ TCHAR buf[MAX_PATH];
|
|
|
|
+ SendMessage(hWnd, WM_GETTEXT, MAX_PATH, (LPARAM)buf);
|
|
|
|
+ _tprintf_s(_T("%s/n"), buf);
|
|
EnumChildWindows(hWnd, EnumChildWindowCallBack, lParam); // 递归查找子窗口
|
|
EnumChildWindows(hWnd, EnumChildWindowCallBack, lParam); // 递归查找子窗口
|
|
- }
|
|
|
|
- return TRUE;
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ return TRUE;
|
|
|
|
+ }
|
|
|
|
|
|
// nStartCount:启动进程数量;
|
|
// nStartCount:启动进程数量;
|
|
void StartGame(std::string strGameDir)
|
|
void StartGame(std::string strGameDir)
|
|
{
|
|
{
|
|
- if ( !PathFileExists(strGameDir.c_str()) )
|
|
|
|
|
|
+ if (!PathFileExists(strGameDir.c_str()))
|
|
return;
|
|
return;
|
|
|
|
|
|
SetCurrentDirectory(strGameDir.c_str());
|
|
SetCurrentDirectory(strGameDir.c_str());
|
|
@@ -373,55 +373,55 @@ namespace GAssist
|
|
Sleep(1500); // Main.exe设置了陷阱(自己再开启了一个进程,结束上一个进程),需要等1.5秒;
|
|
Sleep(1500); // Main.exe设置了陷阱(自己再开启了一个进程,结束上一个进程),需要等1.5秒;
|
|
|
|
|
|
DWORD dwProcId = GAssist::FindProcess(_T("Main.exe"));
|
|
DWORD dwProcId = GAssist::FindProcess(_T("Main.exe"));
|
|
- if ( dwProcId <= 0 )
|
|
|
|
|
|
+ if (dwProcId <= 0)
|
|
return;
|
|
return;
|
|
-
|
|
|
|
|
|
+
|
|
EnumWindows(GAssist::EnumChildWindowCallBack, dwProcId);
|
|
EnumWindows(GAssist::EnumChildWindowCallBack, dwProcId);
|
|
- if ( GAssist::g_vtGameHwnd.size() ) {
|
|
|
|
|
|
+ if (GAssist::g_vtGameHwnd.size()) {
|
|
int nStatus = 0;
|
|
int nStatus = 0;
|
|
GAssist::GameHwnd* gp = NULL;
|
|
GAssist::GameHwnd* gp = NULL;
|
|
GAssist::GameHwnd* gbmin = NULL;
|
|
GAssist::GameHwnd* gbmin = NULL;
|
|
GAssist::GameHwnd* gbentry = NULL;
|
|
GAssist::GameHwnd* gbentry = NULL;
|
|
- for ( std::vector<GAssist::GameHwnd>::iterator it = GAssist::g_vtGameHwnd.begin(); it != GAssist::g_vtGameHwnd.end(); it++ )
|
|
|
|
|
|
+ for (std::vector<GAssist::GameHwnd>::iterator it = GAssist::g_vtGameHwnd.begin(); it != GAssist::g_vtGameHwnd.end(); it++)
|
|
{
|
|
{
|
|
- if ( nStatus >= 3 )
|
|
|
|
|
|
+ if (nStatus >= 3)
|
|
break;
|
|
break;
|
|
|
|
|
|
- if ( _tcsicmp(it->strWinText.c_str(), _T("最小化")) == 0 )
|
|
|
|
|
|
+ if (_tcsicmp(it->strWinText.c_str(), _T("最小化")) == 0)
|
|
{
|
|
{
|
|
gbmin = &*it;
|
|
gbmin = &*it;
|
|
nStatus++;
|
|
nStatus++;
|
|
}
|
|
}
|
|
|
|
|
|
- if ( _tcsicmp(it->strWinText.c_str(), _T("大话水浒")) == 0 )
|
|
|
|
|
|
+ if (_tcsicmp(it->strWinText.c_str(), _T("大话水浒")) == 0)
|
|
{
|
|
{
|
|
gp = &*it;
|
|
gp = &*it;
|
|
nStatus++;
|
|
nStatus++;
|
|
}
|
|
}
|
|
|
|
|
|
- if ( _tcsicmp(it->strWinText.c_str(), _T("进入游戏")) == 0 )
|
|
|
|
|
|
+ if (_tcsicmp(it->strWinText.c_str(), _T("进入游戏")) == 0)
|
|
{
|
|
{
|
|
gbentry = &*it;
|
|
gbentry = &*it;
|
|
nStatus++;
|
|
nStatus++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if ( gp && gbentry && gbmin) {
|
|
|
|
|
|
+ if (gp && gbentry && gbmin) {
|
|
// 发送点击事件;
|
|
// 发送点击事件;
|
|
// 先最小化;
|
|
// 先最小化;
|
|
- ::SendMessage(gp->hwnd,WM_COMMAND,gbmin->dwId,NULL);
|
|
|
|
|
|
+ ::SendMessage(gp->hwnd, WM_COMMAND, gbmin->dwId, NULL);
|
|
// 再进入;
|
|
// 再进入;
|
|
- ::SendMessage(gp->hwnd,WM_COMMAND,gbentry->dwId,NULL);
|
|
|
|
|
|
+ ::SendMessage(gp->hwnd, WM_COMMAND, gbentry->dwId, NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
// 使用WM_LBUTTONDBLCLK完全无效;
|
|
// 使用WM_LBUTTONDBLCLK完全无效;
|
|
void MouseClick(HWND hwnd, POINT pt, BOOL bClientRect)
|
|
void MouseClick(HWND hwnd, POINT pt, BOOL bClientRect)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
-
|
|
|
|
|
|
+
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::SetForegroundWindow(hwnd); // 窗口前置才能单击成功;
|
|
::SetForegroundWindow(hwnd); // 窗口前置才能单击成功;
|
|
#if 0 // 使用Post或Send的方式,鼠标是不会显示出来的;
|
|
#if 0 // 使用Post或Send的方式,鼠标是不会显示出来的;
|
|
@@ -429,7 +429,7 @@ namespace GAssist
|
|
::PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(pt.x, pt.y));
|
|
::PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(pt.x, pt.y));
|
|
#else// 建议使用这种方式,可以看到鼠标;
|
|
#else// 建议使用这种方式,可以看到鼠标;
|
|
POINT ptScreen = pt;
|
|
POINT ptScreen = pt;
|
|
- if ( bClientRect )
|
|
|
|
|
|
+ if (bClientRect)
|
|
ClientToScreen(hwnd, &ptScreen);
|
|
ClientToScreen(hwnd, &ptScreen);
|
|
::SetCursorPos(ptScreen.x, ptScreen.y); // 必须将鼠标定位到目标单击点;
|
|
::SetCursorPos(ptScreen.x, ptScreen.y); // 必须将鼠标定位到目标单击点;
|
|
mouse_event(MOUSEEVENTF_LEFTDOWN, ptScreen.x, ptScreen.y, 0, 0);
|
|
mouse_event(MOUSEEVENTF_LEFTDOWN, ptScreen.x, ptScreen.y, 0, 0);
|
|
@@ -440,7 +440,7 @@ namespace GAssist
|
|
|
|
|
|
void MouseDbClick(HWND hwnd, POINT pt)
|
|
void MouseDbClick(HWND hwnd, POINT pt)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
|
|
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
@@ -505,7 +505,7 @@ namespace GAssist
|
|
|
|
|
|
void MouseClick(HWND hwnd, unsigned int x, unsigned int y)
|
|
void MouseClick(HWND hwnd, unsigned int x, unsigned int y)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
|
|
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
@@ -514,7 +514,7 @@ namespace GAssist
|
|
::PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
|
|
::PostMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
|
|
::PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(x, y));
|
|
::PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(x, y));
|
|
#else
|
|
#else
|
|
- POINT ptScreen = {x,y};
|
|
|
|
|
|
+ POINT ptScreen = { x,y };
|
|
ClientToScreen(hwnd, &ptScreen);
|
|
ClientToScreen(hwnd, &ptScreen);
|
|
::SetCursorPos(ptScreen.x, ptScreen.y);
|
|
::SetCursorPos(ptScreen.x, ptScreen.y);
|
|
mouse_event(MOUSEEVENTF_LEFTDOWN, ptScreen.x, ptScreen.y, 0, 0);
|
|
mouse_event(MOUSEEVENTF_LEFTDOWN, ptScreen.x, ptScreen.y, 0, 0);
|
|
@@ -525,7 +525,7 @@ namespace GAssist
|
|
|
|
|
|
void MouseMove(HWND hwnd, POINT pt)
|
|
void MouseMove(HWND hwnd, POINT pt)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
|
|
|
|
::PostMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, MAKELPARAM(pt.x, pt.y));
|
|
::PostMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, MAKELPARAM(pt.x, pt.y));
|
|
@@ -534,7 +534,7 @@ namespace GAssist
|
|
|
|
|
|
void MouseMove(HWND hwnd, POINT ptStart, POINT ptEnd)
|
|
void MouseMove(HWND hwnd, POINT ptStart, POINT ptEnd)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
|
|
|
|
//::SendMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, lparam);
|
|
//::SendMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, lparam);
|
|
@@ -543,7 +543,7 @@ namespace GAssist
|
|
|
|
|
|
#if 1
|
|
#if 1
|
|
// 计算个中间点;
|
|
// 计算个中间点;
|
|
- POINT ptMid = { (ptStart.x + ptEnd.x) / 2, (ptStart.y + ptEnd.y) / 2};
|
|
|
|
|
|
+ POINT ptMid = { (ptStart.x + ptEnd.x) / 2, (ptStart.y + ptEnd.y) / 2 };
|
|
::PostMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(ptMid.x, ptMid.y));
|
|
::PostMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(ptMid.x, ptMid.y));
|
|
Sleep(200);
|
|
Sleep(200);
|
|
#endif
|
|
#endif
|
|
@@ -556,7 +556,7 @@ namespace GAssist
|
|
// 最后一步直接单击;
|
|
// 最后一步直接单击;
|
|
void MouseMoveEx(HWND hwnd, POINT ptStart, POINT ptEnd)
|
|
void MouseMoveEx(HWND hwnd, POINT ptStart, POINT ptEnd)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
|
|
|
|
//::SendMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, lparam);
|
|
//::SendMessage(hwnd, WM_MOUSEMOVE, MK_LBUTTON, lparam);
|
|
@@ -565,7 +565,7 @@ namespace GAssist
|
|
|
|
|
|
#if 1
|
|
#if 1
|
|
// 计算个中间点;
|
|
// 计算个中间点;
|
|
- POINT ptMid = { (ptStart.x + ptEnd.x) / 2, (ptStart.y + ptEnd.y) / 2};
|
|
|
|
|
|
+ POINT ptMid = { (ptStart.x + ptEnd.x) / 2, (ptStart.y + ptEnd.y) / 2 };
|
|
::PostMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(ptMid.x, ptMid.y));
|
|
::PostMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(ptMid.x, ptMid.y));
|
|
Sleep(200);
|
|
Sleep(200);
|
|
#endif
|
|
#endif
|
|
@@ -578,9 +578,9 @@ namespace GAssist
|
|
|
|
|
|
void DragMouse(HWND hwnd, POINT ptStart, POINT ptEnd)
|
|
void DragMouse(HWND hwnd, POINT ptStart, POINT ptEnd)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
-
|
|
|
|
|
|
+
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::SetForegroundWindow(hwnd);
|
|
::SetForegroundWindow(hwnd);
|
|
#if 0
|
|
#if 0
|
|
@@ -617,7 +617,7 @@ namespace GAssist
|
|
mouse_event(MOUSEEVENTF_LEFTDOWN, ptSStart.x, ptSStart.y, 0, 0);
|
|
mouse_event(MOUSEEVENTF_LEFTDOWN, ptSStart.x, ptSStart.y, 0, 0);
|
|
Sleep(1200);//必须暂停1秒左右,拖动才有效;
|
|
Sleep(1200);//必须暂停1秒左右,拖动才有效;
|
|
// MOUSEEVENTF_ABSOLUTE 使用绝对鼠标位置;
|
|
// MOUSEEVENTF_ABSOLUTE 使用绝对鼠标位置;
|
|
- mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE, ptSEnd.x, ptSEnd.y, 0, 0);
|
|
|
|
|
|
+ mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, ptSEnd.x, ptSEnd.y, 0, 0);
|
|
Sleep(500);
|
|
Sleep(500);
|
|
mouse_event(MOUSEEVENTF_LEFTUP, ptSEnd.x, ptSEnd.y, 0, 0);
|
|
mouse_event(MOUSEEVENTF_LEFTUP, ptSEnd.x, ptSEnd.y, 0, 0);
|
|
#endif
|
|
#endif
|
|
@@ -625,43 +625,43 @@ namespace GAssist
|
|
|
|
|
|
void SendKey(HWND hwnd, DWORD key, BOOL bCtrl /* = FALSE */, BOOL bAtl /* = FALSE */, BOOL bShift /* = FALSE */)
|
|
void SendKey(HWND hwnd, DWORD key, BOOL bCtrl /* = FALSE */, BOOL bAtl /* = FALSE */, BOOL bShift /* = FALSE */)
|
|
{
|
|
{
|
|
- if ( !IsWindow(hwnd) )
|
|
|
|
|
|
+ if (!IsWindow(hwnd))
|
|
return;
|
|
return;
|
|
|
|
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
::SetForegroundWindow(hwnd);
|
|
::SetForegroundWindow(hwnd);
|
|
|
|
|
|
- if ( bCtrl)
|
|
|
|
- keybd_event(VK_CONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | 0,0 );
|
|
|
|
- if ( bAtl )
|
|
|
|
- keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | 0,0 );
|
|
|
|
- if ( bShift )
|
|
|
|
- keybd_event(VK_SHIFT, 0x2A, KEYEVENTF_EXTENDEDKEY | 0,0 );
|
|
|
|
|
|
+ if (bCtrl)
|
|
|
|
+ keybd_event(VK_CONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | 0, 0);
|
|
|
|
+ if (bAtl)
|
|
|
|
+ keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
|
|
|
|
+ if (bShift)
|
|
|
|
+ keybd_event(VK_SHIFT, 0x2A, KEYEVENTF_EXTENDEDKEY | 0, 0);
|
|
Sleep(120); // 注意:有些电脑能响应Ctrl+V,有些不行,则需要加大CTRL与V之间的时间间隔;
|
|
Sleep(120); // 注意:有些电脑能响应Ctrl+V,有些不行,则需要加大CTRL与V之间的时间间隔;
|
|
// key down;
|
|
// key down;
|
|
- keybd_event(key, 0, KEYEVENTF_EXTENDEDKEY | 0,0 );
|
|
|
|
|
|
+ keybd_event(key, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
|
|
// key up;
|
|
// key up;
|
|
- keybd_event(key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
|
|
|
|
|
|
+ keybd_event(key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
|
Sleep(120);
|
|
Sleep(120);
|
|
- if ( bCtrl )
|
|
|
|
- keybd_event(VK_CONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
|
|
|
|
- if ( bAtl )
|
|
|
|
- keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
|
|
|
|
- if ( bShift )
|
|
|
|
- keybd_event(VK_SHIFT, 0x2A, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
|
|
|
|
|
|
+ if (bCtrl)
|
|
|
|
+ keybd_event(VK_CONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
|
|
|
+ if (bAtl)
|
|
|
|
+ keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
|
|
|
+ if (bShift)
|
|
|
|
+ keybd_event(VK_SHIFT, 0x2A, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL SetClipboardString(const char* lpString)
|
|
BOOL SetClipboardString(const char* lpString)
|
|
{
|
|
{
|
|
- if ( lpString == NULL || lpString[0] == '\0' )
|
|
|
|
|
|
+ if (lpString == NULL || lpString[0] == '\0')
|
|
return FALSE;
|
|
return FALSE;
|
|
|
|
|
|
- if ( OpenClipboard(NULL) )
|
|
|
|
|
|
+ if (OpenClipboard(NULL))
|
|
{
|
|
{
|
|
HGLOBAL hClipString;
|
|
HGLOBAL hClipString;
|
|
EmptyClipboard();
|
|
EmptyClipboard();
|
|
hClipString = GlobalAlloc(GMEM_DDESHARE, _tcslen(lpString) + 1);
|
|
hClipString = GlobalAlloc(GMEM_DDESHARE, _tcslen(lpString) + 1);
|
|
- char *lpBuffer = (char*)GlobalLock(hClipString);
|
|
|
|
|
|
+ char* lpBuffer = (char*)GlobalLock(hClipString);
|
|
_tcscpy_s(lpBuffer, _tcslen(lpString) + 1, lpString);
|
|
_tcscpy_s(lpBuffer, _tcslen(lpString) + 1, lpString);
|
|
GlobalUnlock(hClipString);
|
|
GlobalUnlock(hClipString);
|
|
SetClipboardData(CF_TEXT, hClipString);
|
|
SetClipboardData(CF_TEXT, hClipString);
|
|
@@ -675,12 +675,12 @@ namespace GAssist
|
|
|
|
|
|
CString GetClipboradString(/*char *pString, const int len*/)
|
|
CString GetClipboradString(/*char *pString, const int len*/)
|
|
{
|
|
{
|
|
- if ( OpenClipboard(NULL) )
|
|
|
|
|
|
+ if (OpenClipboard(NULL))
|
|
{
|
|
{
|
|
HANDLE hData = GetClipboardData(CF_TEXT);
|
|
HANDLE hData = GetClipboardData(CF_TEXT);
|
|
- if ( hData )
|
|
|
|
|
|
+ if (hData)
|
|
{
|
|
{
|
|
- char *lpBuffer = (char*)GlobalLock(hData);
|
|
|
|
|
|
+ char* lpBuffer = (char*)GlobalLock(hData);
|
|
//memcpy(pString, lpBuffer, len);
|
|
//memcpy(pString, lpBuffer, len);
|
|
CString str(lpBuffer);
|
|
CString str(lpBuffer);
|
|
GlobalUnlock(hData);
|
|
GlobalUnlock(hData);
|
|
@@ -696,7 +696,7 @@ namespace GAssist
|
|
// 截图;
|
|
// 截图;
|
|
HBITMAP CopyDC2Bitmap(HWND hWnd, LPRECT lpRect)
|
|
HBITMAP CopyDC2Bitmap(HWND hWnd, LPRECT lpRect)
|
|
{
|
|
{
|
|
- if ( !lpRect || IsRectEmpty(lpRect) )
|
|
|
|
|
|
+ if (!lpRect || IsRectEmpty(lpRect))
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
HDC hWndDC = ::GetWindowDC(hWnd);
|
|
HDC hWndDC = ::GetWindowDC(hWnd);
|
|
@@ -721,7 +721,7 @@ namespace GAssist
|
|
hMenBitmap = CreateCompatibleBitmap(hWndDC, nWidth, nHeight);
|
|
hMenBitmap = CreateCompatibleBitmap(hWndDC, nWidth, nHeight);
|
|
|
|
|
|
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hMenBitmap);
|
|
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hMenBitmap);
|
|
- ::PrintWindow(hWnd, hMemDC, 0);
|
|
|
|
|
|
+ ::PrintWindow(hWnd, hMemDC, 0);
|
|
// 将窗口DC内存复制到兼容DC上;
|
|
// 将窗口DC内存复制到兼容DC上;
|
|
StretchBlt(hMemDC, 0, 0, nWidth, nHeight, hWndDC, left, top, nWidth, nHeight, SRCCOPY);
|
|
StretchBlt(hMemDC, 0, 0, nWidth, nHeight, hWndDC, left, top, nWidth, nHeight, SRCCOPY);
|
|
//BitBlt(hMemDC, 0, 0, nWidth, nHeight, hWndDC, left, top, SRCCOPY);
|
|
//BitBlt(hMemDC, 0, 0, nWidth, nHeight, hWndDC, left, top, SRCCOPY);
|
|
@@ -736,105 +736,101 @@ namespace GAssist
|
|
BOOL SaveBitmap(HBITMAP hBitmpa, std::string strSavePath)
|
|
BOOL SaveBitmap(HBITMAP hBitmpa, std::string strSavePath)
|
|
{
|
|
{
|
|
//把位图的信息保存到bmpinfo;
|
|
//把位图的信息保存到bmpinfo;
|
|
- BITMAP bmpinfo;
|
|
|
|
- GetObject(hBitmpa,sizeof(BITMAP),&bmpinfo);
|
|
|
|
- DWORD dwBmBitsSize = ((bmpinfo.bmWidth * 32+31)/32) * 4 * bmpinfo.bmHeight;
|
|
|
|
|
|
+ BITMAP bmpinfo;
|
|
|
|
+ GetObject(hBitmpa, sizeof(BITMAP), &bmpinfo);
|
|
|
|
+ DWORD dwBmBitsSize = ((bmpinfo.bmWidth * 32 + 31) / 32) * 4 * bmpinfo.bmHeight;
|
|
//位图文件头 14字节
|
|
//位图文件头 14字节
|
|
- BITMAPFILEHEADER bf;
|
|
|
|
- bf.bfType = 0x4D42;
|
|
|
|
|
|
+ BITMAPFILEHEADER bf;
|
|
|
|
+ bf.bfType = 0x4D42;
|
|
//BM
|
|
//BM
|
|
- bf.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwBmBitsSize;
|
|
|
|
- bf.bfReserved1 = 0;
|
|
|
|
- bf.bfReserved2 = 0;
|
|
|
|
- bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
|
|
|
|
+ bf.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwBmBitsSize;
|
|
|
|
+ bf.bfReserved1 = 0;
|
|
|
|
+ bf.bfReserved2 = 0;
|
|
|
|
+ bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
//位图信息头
|
|
//位图信息头
|
|
- BITMAPINFOHEADER bi;
|
|
|
|
- bi.biSize = sizeof(BITMAPINFOHEADER);
|
|
|
|
- bi.biWidth = bmpinfo.bmWidth;
|
|
|
|
- bi.biHeight = bmpinfo.bmHeight;
|
|
|
|
- bi.biPlanes = 1;
|
|
|
|
- bi.biBitCount = 32;
|
|
|
|
- bi.biCompression = BI_RGB;
|
|
|
|
- bi.biSizeImage = 0;
|
|
|
|
- bi.biXPelsPerMeter = 0;
|
|
|
|
- bi.biYPelsPerMeter = 0;
|
|
|
|
- bi.biClrUsed = 8;
|
|
|
|
- bi.biClrImportant = 0;
|
|
|
|
|
|
+ BITMAPINFOHEADER bi;
|
|
|
|
+ bi.biSize = sizeof(BITMAPINFOHEADER);
|
|
|
|
+ bi.biWidth = bmpinfo.bmWidth;
|
|
|
|
+ bi.biHeight = bmpinfo.bmHeight;
|
|
|
|
+ bi.biPlanes = 1;
|
|
|
|
+ bi.biBitCount = 32;
|
|
|
|
+ bi.biCompression = BI_RGB;
|
|
|
|
+ bi.biSizeImage = 0;
|
|
|
|
+ bi.biXPelsPerMeter = 0;
|
|
|
|
+ bi.biYPelsPerMeter = 0;
|
|
|
|
+ bi.biClrUsed = 8;
|
|
|
|
+ bi.biClrImportant = 0;
|
|
//位图数据;
|
|
//位图数据;
|
|
char* context = new char[dwBmBitsSize];
|
|
char* context = new char[dwBmBitsSize];
|
|
- HDC dc = ::GetDC(NULL);
|
|
|
|
- GetDIBits(dc, hBitmpa, 0, bi.biHeight, context, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
|
|
|
|
- FILE* f = fopen(strSavePath.c_str(),"wb");
|
|
|
|
- fwrite((char*)&bf,sizeof(BITMAPFILEHEADER),1,f);
|
|
|
|
- fwrite((char*)&bi,sizeof(BITMAPINFOHEADER),1,f);
|
|
|
|
- fwrite(context,dwBmBitsSize,1,f);
|
|
|
|
- fclose(f);
|
|
|
|
- delete context;
|
|
|
|
- ::ReleaseDC(NULL,dc);
|
|
|
|
- return 0;
|
|
|
|
|
|
+ HDC dc = ::GetDC(NULL);
|
|
|
|
+ GetDIBits(dc, hBitmpa, 0, bi.biHeight, context, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
|
|
|
|
+ FILE* f = fopen(strSavePath.c_str(), "wb");
|
|
|
|
+ fwrite((char*)&bf, sizeof(BITMAPFILEHEADER), 1, f);
|
|
|
|
+ fwrite((char*)&bi, sizeof(BITMAPINFOHEADER), 1, f);
|
|
|
|
+ fwrite(context, dwBmBitsSize, 1, f);
|
|
|
|
+ fclose(f);
|
|
|
|
+ delete context;
|
|
|
|
+ ::ReleaseDC(NULL, dc);
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
void SaveHwndToBmpFile(HWND hWnd, std::string strSavePath) {
|
|
void SaveHwndToBmpFile(HWND hWnd, std::string strSavePath) {
|
|
- HDC hDC = ::GetWindowDC(hWnd);
|
|
|
|
- ASSERT(hDC);
|
|
|
|
- HDC hMemDC = ::CreateCompatibleDC(hDC);
|
|
|
|
- ASSERT(hMemDC);
|
|
|
|
-
|
|
|
|
- RECT rc;
|
|
|
|
- ::GetWindowRect(hWnd, &rc);
|
|
|
|
- HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
|
|
|
|
-
|
|
|
|
- ASSERT(hBitmap);
|
|
|
|
- HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);
|
|
|
|
- ::PrintWindow(hWnd, hMemDC, 0);
|
|
|
|
- BITMAP bitmap = {0};
|
|
|
|
- ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
|
|
|
|
- BITMAPINFOHEADER bi = {0};
|
|
|
|
- BITMAPFILEHEADER bf = {0};
|
|
|
|
- CONST int nBitCount = 24;
|
|
|
|
- bi.biSize = sizeof(BITMAPINFOHEADER);
|
|
|
|
- bi.biWidth = bitmap.bmWidth;
|
|
|
|
- bi.biHeight = bitmap.bmHeight;
|
|
|
|
- bi.biPlanes = 1;
|
|
|
|
- bi.biBitCount = nBitCount;
|
|
|
|
- bi.biCompression = BI_RGB;
|
|
|
|
- DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight;
|
|
|
|
- HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));
|
|
|
|
- LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
|
|
|
|
- *lpbi = bi;
|
|
|
|
- ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
|
|
|
|
- try
|
|
|
|
- {
|
|
|
|
- CFile file;
|
|
|
|
- file.Open(strSavePath.c_str(), CFile::modeCreate | CFile::modeWrite);
|
|
|
|
- bf.bfType = 0x4d42;
|
|
|
|
- dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
|
|
- bf.bfSize = dwSize;
|
|
|
|
- bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
|
|
- file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER));
|
|
|
|
- file.Write((BYTE*)lpbi, dwSize);
|
|
|
|
- file.Close();
|
|
|
|
- }
|
|
|
|
- catch(CFileException* e)
|
|
|
|
- {
|
|
|
|
- e->ReportError();
|
|
|
|
- e->Delete();
|
|
|
|
- }
|
|
|
|
- GlobalUnlock(hDib);
|
|
|
|
- GlobalFree(hDib);
|
|
|
|
- ::SelectObject(hMemDC, hOldBmp);
|
|
|
|
- ::DeleteObject(hBitmap);
|
|
|
|
- ::DeleteObject(hMemDC);
|
|
|
|
- ::ReleaseDC(hWnd, hDC);
|
|
|
|
|
|
+ HDC hDC = ::GetWindowDC(hWnd);
|
|
|
|
+ ASSERT(hDC);
|
|
|
|
+ HDC hMemDC = ::CreateCompatibleDC(hDC);
|
|
|
|
+ ASSERT(hMemDC);
|
|
|
|
+
|
|
|
|
+ RECT rc;
|
|
|
|
+ ::GetWindowRect(hWnd, &rc);
|
|
|
|
+ HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rc.right - rc.left, rc.bottom - rc.top);
|
|
|
|
+
|
|
|
|
+ ASSERT(hBitmap);
|
|
|
|
+ HBITMAP hOldBmp = (HBITMAP)::SelectObject(hMemDC, hBitmap);
|
|
|
|
+ ::PrintWindow(hWnd, hMemDC, 0);
|
|
|
|
+ BITMAP bitmap = { 0 };
|
|
|
|
+ ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
|
|
|
|
+ BITMAPINFOHEADER bi = { 0 };
|
|
|
|
+ BITMAPFILEHEADER bf = { 0 };
|
|
|
|
+ CONST int nBitCount = 24;
|
|
|
|
+ bi.biSize = sizeof(BITMAPINFOHEADER);
|
|
|
|
+ bi.biWidth = bitmap.bmWidth;
|
|
|
|
+ bi.biHeight = bitmap.bmHeight;
|
|
|
|
+ bi.biPlanes = 1;
|
|
|
|
+ bi.biBitCount = nBitCount;
|
|
|
|
+ bi.biCompression = BI_RGB;
|
|
|
|
+ DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight;
|
|
|
|
+ HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));
|
|
|
|
+ LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
|
|
|
|
+ *lpbi = bi;
|
|
|
|
+ ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
|
|
|
|
+
|
|
|
|
+ CFile file;
|
|
|
|
+ CFileException fep;
|
|
|
|
+ if (file.Open(strSavePath.c_str(), CFile::modeCreate | CFile::modeWrite, &fep)) {
|
|
|
|
+ bf.bfType = 0x4d42;
|
|
|
|
+ dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
|
|
+ bf.bfSize = dwSize;
|
|
|
|
+ bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
|
|
|
|
+ file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER));
|
|
|
|
+ file.Write((BYTE*)lpbi, dwSize);
|
|
|
|
+ file.Close();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ GlobalUnlock(hDib);
|
|
|
|
+ GlobalFree(hDib);
|
|
|
|
+ ::SelectObject(hMemDC, hOldBmp);
|
|
|
|
+ ::DeleteObject(hBitmap);
|
|
|
|
+ ::DeleteObject(hMemDC);
|
|
|
|
+ ::ReleaseDC(hWnd, hDC);
|
|
|
|
|
|
Sleep(30);
|
|
Sleep(30);
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
-// #include <D3D9.h>
|
|
|
|
-// #include <D3dx9tex.h>
|
|
|
|
-// #pragma comment(lib, "D3dx9.lib")
|
|
|
|
- //#include <d3d9helper>
|
|
|
|
|
|
+ // #include <D3D9.h>
|
|
|
|
+ // #include <D3dx9tex.h>
|
|
|
|
+ // #pragma comment(lib, "D3dx9.lib")
|
|
|
|
+ //#include <d3d9helper>
|
|
BOOL ScreenShot(LPDIRECT3DDEVICE9 lpDevice, HWND hWnd, TCHAR* fileName)
|
|
BOOL ScreenShot(LPDIRECT3DDEVICE9 lpDevice, HWND hWnd, TCHAR* fileName)
|
|
{
|
|
{
|
|
HRESULT hr;
|
|
HRESULT hr;
|
|
@@ -879,50 +875,50 @@ namespace GAssist
|
|
}
|
|
}
|
|
|
|
|
|
// 判断窗口是否被遮住;
|
|
// 判断窗口是否被遮住;
|
|
- bool IsCoveredByOtherWindow(HWND hWnd)
|
|
|
|
- {
|
|
|
|
- RECT rcTarget;
|
|
|
|
|
|
+ bool IsCoveredByOtherWindow(HWND hWnd)
|
|
|
|
+ {
|
|
|
|
+ RECT rcTarget;
|
|
GetWindowRect(hWnd, &rcTarget);
|
|
GetWindowRect(hWnd, &rcTarget);
|
|
- bool isChild = (WS_CHILD == (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD));
|
|
|
|
|
|
+ bool isChild = (WS_CHILD == (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD));
|
|
|
|
|
|
- if ( GetDesktopWindow() == hWnd )
|
|
|
|
|
|
+ if (GetDesktopWindow() == hWnd)
|
|
hWnd = GetWindow(GetTopWindow(hWnd), GW_HWNDLAST);
|
|
hWnd = GetWindow(GetTopWindow(hWnd), GW_HWNDLAST);
|
|
|
|
|
|
- do
|
|
|
|
- {
|
|
|
|
- HWND hCurWnd = hWnd;
|
|
|
|
- while ( NULL != (hWnd = GetNextWindow(hWnd, GW_HWNDPREV) ))
|
|
|
|
- {
|
|
|
|
|
|
+ do
|
|
|
|
+ {
|
|
|
|
+ HWND hCurWnd = hWnd;
|
|
|
|
+ while (NULL != (hWnd = GetNextWindow(hWnd, GW_HWNDPREV)))
|
|
|
|
+ {
|
|
//过滤了非窗口,没有显示的,无效的,非windows工具栏,置顶的窗口。如果不过滤非工具栏的句柄,那么会得到一些奇怪的窗口,会很难判断是否被遮住。
|
|
//过滤了非窗口,没有显示的,无效的,非windows工具栏,置顶的窗口。如果不过滤非工具栏的句柄,那么会得到一些奇怪的窗口,会很难判断是否被遮住。
|
|
//if ( IsWindow(hWnd) && IsWindowVisible(hWnd) && IsWindowEnabled(hWnd) && !(GetWindowLong(hWnd,GWL_EXSTYLE)& WS_EX_TOOLWINDOW) && !(GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOPMOST))
|
|
//if ( IsWindow(hWnd) && IsWindowVisible(hWnd) && IsWindowEnabled(hWnd) && !(GetWindowLong(hWnd,GWL_EXSTYLE)& WS_EX_TOOLWINDOW) && !(GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOPMOST))
|
|
- if ( ::IsWindowVisible(hWnd) )
|
|
|
|
- {
|
|
|
|
|
|
+ if (::IsWindowVisible(hWnd))
|
|
|
|
+ {
|
|
RECT rcWnd;
|
|
RECT rcWnd;
|
|
- GetWindowRect(hWnd, &rcWnd);
|
|
|
|
|
|
+ GetWindowRect(hWnd, &rcWnd);
|
|
|
|
|
|
- if ( !((rcWnd.right < rcTarget.left) || (rcWnd.left > rcTarget.right) ||
|
|
|
|
- (rcWnd.bottom < rcTarget.top) || (rcWnd.top > rcTarget.bottom)) )
|
|
|
|
- {
|
|
|
|
|
|
+ if (!((rcWnd.right < rcTarget.left) || (rcWnd.left > rcTarget.right) ||
|
|
|
|
+ (rcWnd.bottom < rcTarget.top) || (rcWnd.top > rcTarget.bottom)))
|
|
|
|
+ {
|
|
return true;
|
|
return true;
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if ( isChild )
|
|
|
|
- {
|
|
|
|
- hWnd = GetParent(hCurWnd);
|
|
|
|
- isChild = (WS_CHILD == (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD));
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (isChild)
|
|
|
|
+ {
|
|
|
|
+ hWnd = GetParent(hCurWnd);
|
|
|
|
+ isChild = (WS_CHILD == (GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD));
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
break;
|
|
break;
|
|
- }
|
|
|
|
- }while ( true );
|
|
|
|
|
|
+ }
|
|
|
|
+ } while (true);
|
|
|
|
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- BOOL OpenImage(std::string strImag, cv::Mat &img)
|
|
|
|
|
|
+ BOOL OpenImage(std::string strImag, cv::Mat& img)
|
|
{
|
|
{
|
|
if (!PathFileExists(strImag.c_str()))
|
|
if (!PathFileExists(strImag.c_str()))
|
|
return FALSE;
|
|
return FALSE;
|
|
@@ -937,7 +933,7 @@ namespace GAssist
|
|
return TRUE;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
|
|
- BOOL SetImgThreshold(cv::Mat &srcImg, cv::Mat &thresholdImg, long nThresholdVal, long nMaxThresholdVal, int type)
|
|
|
|
|
|
+ BOOL SetImgThreshold(cv::Mat& srcImg, cv::Mat& thresholdImg, long nThresholdVal, long nMaxThresholdVal, int type)
|
|
{
|
|
{
|
|
if (srcImg.data == NULL)
|
|
if (srcImg.data == NULL)
|
|
return FALSE;
|
|
return FALSE;
|
|
@@ -947,38 +943,38 @@ namespace GAssist
|
|
|
|
|
|
switch (type)
|
|
switch (type)
|
|
{
|
|
{
|
|
- case 0://全局阀值;
|
|
|
|
- {
|
|
|
|
- // 转成灰阶图;
|
|
|
|
- cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
- // 再高斯模糊处理(滤波);
|
|
|
|
- cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(5, 5), 0, 0);
|
|
|
|
- // 二值化;//全局化指定的阀值与返回值相等;
|
|
|
|
- double dRetVal = cv::threshold(thresholdImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY);
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case 1://自适应阀值;
|
|
|
|
- {
|
|
|
|
- // 转成灰阶图;
|
|
|
|
- cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
- // 再高斯模糊处理(滤波);
|
|
|
|
- cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(3, 3), 0, 0);
|
|
|
|
- // 自适应阀值;
|
|
|
|
- cv::medianBlur(thresholdImg, thresholdImg, 3);
|
|
|
|
- // 局部二值化;//blocksize一般取3、5、7
|
|
|
|
- cv::adaptiveThreshold(thresholdImg, thresholdImg, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 3, 4.5);
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case 2:// otsu阀值;
|
|
|
|
- {
|
|
|
|
- cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
- // 高斯模糊;
|
|
|
|
- cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(3, 3), 0, 0);
|
|
|
|
- cv::threshold(thresholdImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY | cv::THRESH_OTSU);
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- break;
|
|
|
|
|
|
+ case 0://全局阀值;
|
|
|
|
+ {
|
|
|
|
+ // 转成灰阶图;
|
|
|
|
+ cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
+ // 再高斯模糊处理(滤波);
|
|
|
|
+ cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(5, 5), 0, 0);
|
|
|
|
+ // 二值化;//全局化指定的阀值与返回值相等;
|
|
|
|
+ double dRetVal = cv::threshold(thresholdImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 1://自适应阀值;
|
|
|
|
+ {
|
|
|
|
+ // 转成灰阶图;
|
|
|
|
+ cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
+ // 再高斯模糊处理(滤波);
|
|
|
|
+ cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(3, 3), 0, 0);
|
|
|
|
+ // 自适应阀值;
|
|
|
|
+ cv::medianBlur(thresholdImg, thresholdImg, 3);
|
|
|
|
+ // 局部二值化;//blocksize一般取3、5、7
|
|
|
|
+ cv::adaptiveThreshold(thresholdImg, thresholdImg, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 3, 4.5);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 2:// otsu阀值;
|
|
|
|
+ {
|
|
|
|
+ cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
+ // 高斯模糊;
|
|
|
|
+ cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(3, 3), 0, 0);
|
|
|
|
+ cv::threshold(thresholdImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY | cv::THRESH_OTSU);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
return TRUE;
|
|
return TRUE;
|
|
@@ -1113,15 +1109,15 @@ namespace GAssist
|
|
// 是否大于最低匹配度;
|
|
// 是否大于最低匹配度;
|
|
return (lv_nMaxVal >= lowestMatchValue ? TRUE : FALSE);
|
|
return (lv_nMaxVal >= lowestMatchValue ? TRUE : FALSE);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
void ZhiYeDaTiaoZhan()
|
|
void ZhiYeDaTiaoZhan()
|
|
{
|
|
{
|
|
// 判断当前地图是否在应天府;
|
|
// 判断当前地图是否在应天府;
|
|
//// 是:打开世界地图,寻路到NPC;
|
|
//// 是:打开世界地图,寻路到NPC;
|
|
//// 否:退出
|
|
//// 否:退出
|
|
-
|
|
|
|
|
|
+
|
|
// 对话NPC,进入地图;
|
|
// 对话NPC,进入地图;
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|