浏览代码

1、添加剑客孤独洞中的技能模板图片;
2、注意有些电脑CTRL+V能生效,有些不行,此时需要修改CTRL之V之间的时间间隔;

Jeff 5 年之前
父节点
当前提交
88559ef506

+ 129 - 27
GameAssist/GameAssist/Assist.cpp

@@ -12,6 +12,131 @@ namespace GAssist
 {
 	int frameWidth = 2;
 	int titleBarHeight = 25;
+
+	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];
+	std::string g_strAppdir;
+	std::map<byte, byte> vsKey;
+
+	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;
+
+		// 插入map;
+		// https://blog.csdn.net/xiadasong007/article/details/5026948?utm_source=blogxgwz0;
+		vsKey.insert(std::pair<byte, byte>(VK_F1, 0x3B));
+		vsKey.insert(std::pair<byte, byte>(VK_F2, 0x3C));
+		vsKey.insert(std::pair<byte, byte>(VK_F3, 0x3D));
+		vsKey.insert(std::pair<byte, byte>(VK_F4, 0x3E));
+		vsKey.insert(std::pair<byte, byte>(VK_F5, 0x3F));
+		vsKey.insert(std::pair<byte, byte>(VK_F6, 0x40));
+		vsKey.insert(std::pair<byte, byte>(VK_F7, 0x41));
+		vsKey.insert(std::pair<byte, byte>(VK_F8, 0x42));
+		vsKey.insert(std::pair<byte, byte>(VK_F9, 0x43));
+		vsKey.insert(std::pair<byte, byte>(VK_F10, 0x44));
+		vsKey.insert(std::pair<byte, byte>(VK_F11, 0x57));
+		vsKey.insert(std::pair<byte, byte>(VK_F12, 0x58));
+
+		vsKey.insert(std::pair<byte, byte>(VK_NUMLOCK, 0x45));
+		vsKey.insert(std::pair<byte, byte>(VK_SCROLL, 0x46));
+		vsKey.insert(std::pair<byte, byte>(VK_LSHIFT, 0x2A));
+		vsKey.insert(std::pair<byte, byte>(VK_RSHIFT, 0x36));
+		vsKey.insert(std::pair<byte, byte>(VK_LCONTROL, 0x1D));
+		vsKey.insert(std::pair<byte, byte>(VK_RCONTROL, 0x58));
+		vsKey.insert(std::pair<byte, byte>(VK_LMENU, 0x38));
+		vsKey.insert(std::pair<byte, byte>(VK_RMENU, 0x58));
+
+		vsKey.insert(std::pair<byte, byte>(VK_BACK, 0x0E)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_TAB, 0x0F)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_RETURN, 0x1C)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_SHIFT, 0x2F)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_CONTROL, 0x2F)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_MENU, 0x2F)); // Alt;
+		vsKey.insert(std::pair<byte, byte>(VK_PAUSE, 0x2F)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_CAPITAL, 0x3A)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_ESCAPE, 0x01)); // V;
+		vsKey.insert(std::pair<byte, byte>(VK_SPACE, 0x39)); // 空格;
+
+		// 方向键;
+		vsKey.insert(std::pair<byte, byte>(VK_END, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_HOME, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_LEFT, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_UP, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_RIGHT, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_DOWN, 0x0E)); // 空格;
+
+		// 系统功能键;
+		vsKey.insert(std::pair<byte, byte>(VK_PRINT, 0x54)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_SNAPSHOT, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_INSERT, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_DELETE, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_LWIN, 0x0E)); // 空格;
+		vsKey.insert(std::pair<byte, byte>(VK_RWIN, 0x0E)); // 空格;
+
+		// 小键盘;
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD0, 0x52));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD1, 0x4F));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD2, 0x50));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD3, 0x51));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD4, 0x4B));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD5, 0x4C));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD6, 0x4D));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD7, 0x47));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD8, 0x48));
+		vsKey.insert(std::pair<byte, byte>(VK_NUMPAD9, 0x49));
+
+		vsKey.insert(std::pair<byte, byte>(VK_MULTIPLY, 0x37));
+		vsKey.insert(std::pair<byte, byte>(VK_ADD, 0x4E));
+		vsKey.insert(std::pair<byte, byte>(VK_SEPARATOR, 0x0E));
+		vsKey.insert(std::pair<byte, byte>(VK_SUBTRACT, 0x4A));
+		vsKey.insert(std::pair<byte, byte>(VK_DECIMAL, 0x0E));
+		vsKey.insert(std::pair<byte, byte>(VK_DIVIDE, 0x0E));
+	}
+
+	void ShowLog(const TCHAR* format, ...)
+	{
+		// 获取今年年份;
+		__time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
+		struct tm gmtm = { 0 };
+		localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
+
+		// 格式化前设置语言区域;
+		TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
+		_tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
+
+		// 格式化日志内容;
+		va_list		args = NULL;
+		int			len = 0;
+		TCHAR* buffer = NULL;
+		va_start(args, format);
+		// _vscprintf doesn't count. terminating '\0'
+		len = _vsctprintf(format, args) + 1;
+		buffer = (TCHAR*)malloc(len * sizeof(TCHAR) + 2);
+		_tcscat_s(buffer, len * sizeof(TCHAR) + 2, _T("\n"));
+		_vstprintf_s(buffer, len, format, args);
+		// 将日志内容输入到文件中;
+
+		OutputDebugString(buffer);
+
+		// 关闭文件,释放资源并设置回原语言区域;
+		free(buffer);
+		_tsetlocale(LC_CTYPE, old_locale);
+		free(old_locale);//还原区域设定;
+	}
+
 	// 根据路径名查找进程,返回进程ID;
 	DWORD FindProcess(IN LPCSTR lpProName)
 	{
@@ -347,29 +472,6 @@ namespace GAssist
 #endif
 	}
 
-	void SendCtrlKey(HWND hwnd)
-	{
-
-	}
-
-	void SendKey2(HWND hwnd, DWORD key)
-	{
-		if ( !IsWindow(hwnd) )
-			return;
-
-		::ShowWindow(hwnd, SW_SHOWNORMAL);
-		::SetForegroundWindow(hwnd);
-#if 0
-		::PostMessage(hwnd, WM_KEYDOWN, key, 1);
-		Sleep(50);
-		::PostMessage(hwnd, WM_KEYUP, key, 1);
-#else
-		// 建议用这个;
-		keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY | 0,0 );
-		keybd_event(key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
-#endif
-	}
-
 	void SendKey(HWND hwnd, DWORD key, BOOL bCtrl /* = FALSE */, BOOL bAtl /* = FALSE */, BOOL bShift /* = FALSE */)
 	{
 		if ( !IsWindow(hwnd) )
@@ -384,12 +486,12 @@ namespace GAssist
 			keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY | 0,0 );
 		if ( bShift )
 			keybd_event(VK_SHIFT, 0x2A, KEYEVENTF_EXTENDEDKEY | 0,0 );
-		Sleep(20);
+		Sleep(120);	// 注意:有些电脑能响应Ctrl+V,有些不行,则需要加大CTRL与V之间的时间间隔;
 		// key down;
 		keybd_event(key, 0, KEYEVENTF_EXTENDEDKEY | 0,0 );
 		// key up;
 		keybd_event(key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
-		Sleep(20);
+		Sleep(120);
 		if ( bCtrl )
 			keybd_event(VK_CONTROL, 0x1D, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
 		if ( bAtl )
@@ -521,7 +623,7 @@ namespace GAssist
 		return 0;    
 	}
 
-	void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) { 	
+	void SaveHwndToBmpFile(HWND hWnd, std::string strSavePath) {
 		HDC hDC = ::GetWindowDC(hWnd); 	
 		ASSERT(hDC); 	 	
 		HDC hMemDC = ::CreateCompatibleDC(hDC); 	
@@ -553,7 +655,7 @@ namespace GAssist
 		try 	
 		{ 		
 			CFile file; 		
-			file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite); 		
+			file.Open(strSavePath.c_str(), CFile::modeCreate | CFile::modeWrite);
 			bf.bfType = 0x4d42; 		
 			dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 		
 			bf.bfSize = dwSize; 		

+ 17 - 1
GameAssist/GameAssist/Assist.h

@@ -3,13 +3,25 @@
 
 #pragma once
 
+#include <map>
+#include <string>
 
 namespace GAssist
 {
 	extern int titleBarHeight;
 	extern int frameWidth;
+
+	extern TCHAR g_szCurModuleFileName[MAX_PATH];
+	extern TCHAR g_szCurModuleDir[MAX_PATH];
+	extern TCHAR g_szCurModulePath[MAX_PATH];
+	extern TCHAR g_szFna[_MAX_FNAME];
+	extern TCHAR g_szExt[_MAX_EXT];
+	extern std::string g_strAppdir;
 	//const TCHAR g_szGamePath[MAX_PATH] = _T("E:\\dhsh\\shdata\\Main.exe");
 	const TCHAR g_szGamePath[MAX_PATH] = _T("D:\\tools\\dhsh\\shdata\\Main.exe");
+
+	extern void Init();
+	extern void ShowLog(const TCHAR* format, ...);
 	extern DWORD FindProcess(IN LPCSTR lpProName);
 	extern HWND GetProMainHwnd(DWORD dwProcessId);
 	extern BOOL CALLBACK EnumChildWindowCallBack(HWND hWnd, LPARAM lParam);
@@ -21,6 +33,9 @@ namespace GAssist
 		HWND			hwnd;				// ¿Ø¼þ¾ä±ú;
 	}GameHwnd, *pGameHwnd;
 
+	// key_eventµÄvirtaul+scan
+	extern std::map<byte, byte> vsKey;
+
 	extern std::vector<GameHwnd> g_vtGameHwnd;
 
 	typedef struct __GAC__ {
@@ -67,7 +82,8 @@ namespace GAssist
 	HBITMAP CopyDC2Bitmap(HWND hWnd, LPRECT lpRect);
 	// ±£´æÍ¼Æ¬;
 	BOOL SaveBitmap(HBITMAP hBitmpa, std::string strSavePath);
-	void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath);
+	//void SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath);
+	void SaveHwndToBmpFile(HWND hWnd, std::string strSavePath);
 	bool IsCoveredByOtherWindow(HWND  hWnd);
 
 	BOOL OpenImage(std::string strImag, cv::Mat &img);

+ 39 - 30
GameAssist/GameAssist/GameAssistDlg.cpp

@@ -11,6 +11,13 @@
 #define new DEBUG_NEW
 #endif
 
+#define FIND_NPC(hWnd, NPC) \
+GAssist::SetClipboardString(NPC);\
+GAssist::SendKey(hWnd, VK_TAB); Sleep(100);\
+GAssist::MouseClick(hWnd, CPoint(600, 100)); Sleep(200);\
+GAssist::SendKey(hWnd, 0x56, TRUE); Sleep(200);\
+GAssist::MouseDbClick(hWnd, CPoint(485, 162)); Sleep(200);\
+GAssist::SendKey(hWnd, VK_TAB);
 
 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
 
@@ -101,7 +108,7 @@ BOOL CGameAssistDlg::OnInitDialog()
 	SetIcon(m_hIcon, FALSE);		// 设置小图标
 
 	// TODO: 在此添加额外的初始化代码
-	cv::Mat imgTmp;
+	GAssist::Init();
 
 	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
 }
@@ -204,30 +211,31 @@ void CGameAssistDlg::OnBnClickedOpengame()
 
 	if ( 1 )
 	{// 小窗口-职业挑战;
-		// 打开世界地图;
-		GAssist::SendKey(hProWnd, VK_TAB);Sleep(300);
-		// Click
-		GAssist::MouseClick(hProWnd, CPoint(600, 100));Sleep(200);
-		// 设置剪切板:职业大挑战;
-		GAssist::SetClipboardString("职业训导大师");Sleep(200);
-		// Ctrl+V
-		GAssist::SendKey(hProWnd, 0x56, TRUE);Sleep(300);
-		// DbClick
-		GAssist::MouseDbClick(hProWnd, CPoint(485, 162));Sleep(200);
-		// 退出世界地址;
-		GAssist::SendKey(hProWnd, VK_TAB);Sleep(200);
+		//// 打开世界地图;
+		//GAssist::SendKey(hProWnd, VK_TAB);Sleep(300);
+		//// Click
+		//GAssist::MouseClick(hProWnd, CPoint(600, 100));Sleep(200);
+		//// 设置剪切板:职业大挑战;
+		//GAssist::SetClipboardString("职业训导大师");Sleep(200);
+		//// Ctrl+V
+		//GAssist::SendKey(hProWnd, 0x56, TRUE);Sleep(300);
+		//// DbClick
+		//GAssist::MouseDbClick(hProWnd, CPoint(485, 162));Sleep(200);
+		//// 退出世界地址;
+		//GAssist::SendKey(hProWnd, VK_TAB);Sleep(200);
+		FIND_NPC(hProWnd, _T("职业训导大师"));
 
 		// 截图;
-		GAssist::SaveHwndToBmpFile(hProWnd, "G:\\bin\\GameAssist\\Game.bmp");
+		GAssist::SaveHwndToBmpFile(hProWnd, GAssist::g_strAppdir + _T("Game.bmp"));
 
 		// 选择进入;
 		RECT rc;
 		BOOL bMatch = FALSE;
 		int trySize = 20;
-		while ( !(bMatch = GAssist::GetImgMatchtemplate(_T("G:\\bin\\GameAssist\\Game.bmp"), _T("G:\\bin\\GameAssist\\zyxdds-wytztm.bmp"), rc)) ) {
+		while ( !(bMatch = GAssist::GetImgMatchtemplate(GAssist::g_strAppdir + _T("Game.bmp"), GAssist::g_strAppdir + _T("img\\zyxdds-wytztm.bmp"), rc)) ) {
 			Sleep(3000);
 			// 截图;
-			GAssist::SaveHwndToBmpFile(hProWnd, "G:\\bin\\GameAssist\\Game.bmp");
+			GAssist::SaveHwndToBmpFile(hProWnd, GAssist::g_strAppdir + _T("Game.bmp"));
 			if ( !trySize-- ) break;
 		}
 
@@ -240,28 +248,29 @@ void CGameAssistDlg::OnBnClickedOpengame()
 			Sleep(2300);// 等出图;
 
 			// 再单击:我准备好了;
-			GAssist::SaveHwndToBmpFile(hProWnd, "G:\\bin\\GameAssist\\Game.bmp");
-			if (GAssist::GetImgMatchtemplate(_T("G:\\bin\\GameAssist\\Game.bmp"), _T("G:\\bin\\GameAssist\\zyxdds-zbhl.bmp"), rc)) {
+			GAssist::SaveHwndToBmpFile(hProWnd, GAssist::g_strAppdir + _T("Game.bmp"));
+			if (GAssist::GetImgMatchtemplate(GAssist::g_strAppdir + _T("Game.bmp"), GAssist::g_strAppdir + _T("img\\zyxdds-zbhl.bmp"), rc)) {
 				GAssist::MouseMove(hProWnd, CPoint(rc.left, rc.top));
 				GAssist::MouseClick(hProWnd, CPoint((rc.right + rc.left) / 2, (rc.top + rc.bottom) / 2), TRUE);
 
 				Sleep(1000);//等进入地图;
 				if (1) {// 挑战医师;
 					// 打开世界地图;
-					GAssist::SendKey(hProWnd, VK_TAB); Sleep(200);
-					// Click
-					GAssist::MouseClick(hProWnd, CPoint(600, 100)); Sleep(200);
-					// 设置剪切板:职业大挑战;
-					GAssist::SetClipboardString("医师独侠"); Sleep(200);
-					// Ctrl+V
-					GAssist::SendKey(hProWnd, 0x56, TRUE); Sleep(200);
-					// DbClick
-					GAssist::MouseDbClick(hProWnd, CPoint(485, 162)); Sleep(200);
-					// 退出世界地址;
-					GAssist::SendKey(hProWnd, VK_TAB); Sleep(200);
+// 					GAssist::SendKey(hProWnd, VK_TAB); Sleep(200);
+// 					// Click
+// 					GAssist::MouseClick(hProWnd, CPoint(600, 100)); Sleep(200);
+// 					// 设置剪切板:职业大挑战;
+// 					GAssist::SetClipboardString("医师独侠"); Sleep(200);
+// 					// Ctrl+V
+// 					GAssist::SendKey(hProWnd, 0x56, TRUE); Sleep(200);
+// 					// DbClick
+// 					GAssist::MouseDbClick(hProWnd, CPoint(485, 162)); Sleep(200);
+// 					// 退出世界地址;
+// 					GAssist::SendKey(hProWnd, VK_TAB); Sleep(200);
+					FIND_NPC(hProWnd, _T("医师独侠"));
 
 					// 截图;
-					GAssist::SaveHwndToBmpFile(hProWnd, "G:\\bin\\GameAssist\\Game.bmp");
+					GAssist::SaveHwndToBmpFile(hProWnd, GAssist::g_strAppdir + _T("Game.bmp"));
 				}
 			}
 		}

二进制
GameAssist/img/gdd/name.bmp


二进制
GameAssist/img/jn-jk/gdd/byly.bmp


二进制
GameAssist/img/jn-jk/gdd/d1c.bmp


二进制
GameAssist/img/jn-jk/gdd/fsj.bmp


二进制
GameAssist/img/jn-jk/gdd/lys.bmp


二进制
GameAssist/img/jn-jk/gdd/qxlck.bmp


二进制
GameAssist/img/jn-jk/gdd/rnj.bmp


二进制
GameAssist/img/jn-jk/gdd/syy.bmp


二进制
GameAssist/img/jn-jk/gdd/txj.bmp


二进制
GameAssist/img/jn-jk/gdd/xfp.bmp


二进制
GameAssist/img/jn-jk/gdd/xks.bmp


二进制
GameAssist/img/jn-jk/gdd/xxj.bmp


二进制
GameAssist/img/jn-jk/gdd/xyy.bmp