|
@@ -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;
|