From 14db1514fec89db599766d4996b4bb1fead0eff0 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期四, 25 八月 2022 17:49:54 +0800 Subject: [PATCH] '完善' --- ConsoleApplication/THSActionUtil.cpp | 257 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 231 insertions(+), 26 deletions(-) diff --git a/ConsoleApplication/THSActionUtil.cpp b/ConsoleApplication/THSActionUtil.cpp index 8fc9d8a..a3f4ca9 100644 --- a/ConsoleApplication/THSActionUtil.cpp +++ b/ConsoleApplication/THSActionUtil.cpp @@ -1,6 +1,8 @@ #include "THSActionUtil.h" #include "ImgDivider.h" #include "Win32Util.h" +#include <fstream> + bool isL2Screen(string str) { if (str.find("同花顺(") != string::npos) { @@ -49,7 +51,7 @@ std::string path = "C:\\Users\\Administrator\\Desktop\\ocr\\gpcode\\"; path.append(std::to_string(rand())).append("_listen.jpg"); imwrite(path, img); - throw string("代码数字分隔出错"); + throw string("代码数字分隔出错(32)"); } return nums; } @@ -181,19 +183,36 @@ } if (!zp) { - throw string("同花顺主屏L2窗口未打开"); + throw string("同花顺主屏L2窗口未打开(01)"); } if (!fp) { - throw string("同花顺副屏1没有打开"); + throw string("同花顺副屏1没有打开(02)"); } if (!fp2) { - throw string("同花顺副屏2没有打开"); + throw string("同花顺副屏2没有打开(03)"); } return true; +} + +void THSActionUtil::openL2Screen() { + + + HWND l2 = getL2Win(); + if (l2 <= 0) { + //尝试打开主屏 + HWND main = THSActionUtil::getMainWin(); + if (main > 0) + { + Win32Util::focus(main); + Win32Util::keyboardNum(".00", 200); + Win32Util::keyboard(13, 10); + Sleep(1000); + } + } } void THSActionUtil::openSecondScreen() { @@ -230,7 +249,7 @@ if (!open) { if (mainPage <= 0) { - throw string("未找到首页"); + throw string("未找到首页(04)"); } Win32Util::focus(mainPage); @@ -290,7 +309,7 @@ if (!open) { if (mainPage <= 0) { - throw string("未找到首页"); + throw string("未找到首页(05)"); } Win32Util::focus(mainPage); @@ -315,6 +334,26 @@ } } +void THSActionUtil::openTradeSuccessScreen() +{ + HWND hwnd = getTradeSuccessWindow(); + if (hwnd <= 0) { + throw string("交易窗口未打开(06)"); + } + + hwnd = FindWindowExA(hwnd, NULL, "AfxMDIFrame140s", NULL); + hwnd = FindWindowExA(hwnd, NULL, "AfxWnd140s", NULL); + hwnd = FindWindowExA(hwnd, NULL, NULL, "HexinScrollWnd"); + hwnd = FindWindowExA(hwnd, NULL, NULL, "HexinScrollWnd2"); + hwnd = FindWindowExA(hwnd, NULL, "SysTreeView32", NULL); + if (hwnd <= 0) { + throw string("未找到交易窗口菜单(07)"); + } + //点击当日委托 + SendMessage(hwnd, WM_LBUTTONDOWN, 0x00000001, 0x00E70047); + SendMessage(hwnd, WM_LBUTTONUP, 0x00000000, 0x00E70047); +} + //添加股票 bool THSActionUtil::setGP(std::string quickCode, list<std::string> codeList, RecognitionManager* recognitionManager) { @@ -333,7 +372,7 @@ sw = getSecondWindow(); } if (sw <= 0) { - throw string("未打开副屏"); + throw string("未打开副屏(11)"); } //打开板块 @@ -354,7 +393,7 @@ cout << "副屏截图:" << oimg.rows << "-" << oimg.cols << endl; if (oimg.cols <= 0 || oimg.rows <= 0) { - throw string("板块截屏内容为空"); + throw string("板块截屏内容为空(12)"); } cv::Mat img = ImgUtil::grayImage(oimg); @@ -419,7 +458,7 @@ oimg = CaptureUtil::capture(content); if (oimg.cols <= 0 || oimg.rows <= 0) { - throw string("板块截屏内容为空"); + throw string("板块截屏内容为空(13)"); } img = ImgUtil::grayImage(oimg); areaList = recognitionGPArea(img); @@ -456,14 +495,14 @@ sw = getSecondWindow(); } if (sw <= 0) { - throw string("未打开副屏"); + throw string("未打开副屏(14)"); } HWND content = FindWindowExA(sw, NULL, "AfxFrameOrView100s", NULL); cv::Mat oimg = CaptureUtil::capture(content); cv::Mat img = ImgUtil::grayImage(oimg); if (img.cols <= 0 || img.rows <= 0) { - throw string("板块截屏内容为空"); + throw string("板块截屏内容为空(15)"); } std::list<GPCodeArea> areaList = recognitionGPArea(img); for (std::list<GPCodeArea>::iterator ele = areaList.begin();ele != areaList.end();++ele) { @@ -502,7 +541,7 @@ std::list<int*> dataItemList; for (int i = start_row;i < end_row;i++) { - bool empty = ImgDivider::isRowEmpty(img, i, start_col, start_col + 50, 1, _IMG_BINARY_THRESHOLD)&& ImgDivider::isRowEmpty(img, i, start_col+50, start_col + 150, 2, _IMG_BINARY_THRESHOLD) && ImgDivider::isRowEmpty(img, i, start_col + (end_col - start_col) / 2 - 40, start_col + (end_col - start_col) / 2 + 40, 1, _IMG_BINARY_THRESHOLD); + bool empty = ImgDivider::isRowEmpty(img, i, start_col, start_col + 50, 1, _IMG_BINARY_THRESHOLD) && ImgDivider::isRowEmpty(img, i, start_col + 50, start_col + 150, 2, _IMG_BINARY_THRESHOLD) && ImgDivider::isRowEmpty(img, i, start_col + (end_col - start_col) / 2 - 40, start_col + (end_col - start_col) / 2 + 40, 1, _IMG_BINARY_THRESHOLD); if (empty) { if (emptyStartRow < 0) { emptyStartRow = i; @@ -584,8 +623,8 @@ contentEndRow = img.rows - 1; } - if (contentStartRow < 0|| contentEndRow<0) { - throw string("起始行分隔出错"); + if (contentStartRow < 0 || contentEndRow < 0) { + throw string("起始行分隔出错(16)"); } //分隔列 @@ -601,7 +640,7 @@ } if (startC < 0) { - throw string("内容框分隔出错"); + throw string("内容框分隔出错(17)"); } GPCodeArea area = GPCodeArea(); area.startx = 0; @@ -629,7 +668,7 @@ } if (contentStartRow < 0) { - throw string("起始行分隔出错"); + throw string("起始行分隔出错(18)"); } //分隔列 @@ -654,7 +693,7 @@ } if (startC < 0 || endC < 0) { - throw string("内容框分隔出错"); + throw string("内容框分隔出错(19)"); } //再次分隔内容框,排除干扰 @@ -864,7 +903,7 @@ } if (contentStartRow < 0) { - throw string("起始行分隔出错"); + throw string("起始行分隔出错(20)"); } //分隔列 @@ -889,7 +928,7 @@ } if (startC < 0 || endC < 0) { - throw string("内容框分隔出错"); + throw string("内容框分隔出错(21)"); } //cv::imshow("内容", cv::Mat(img, cv::Rect(startC, contentStartRow, endC - startC, rows - contentStartRow))); @@ -900,7 +939,7 @@ resultList = splitGPCodeArea(img, contentStartRow + 25, startC, rows, endC); } catch (...) { - throw string("分隔代码区域出错"); + throw string("分隔代码区域出错(22)"); } return resultList; } @@ -996,7 +1035,7 @@ } //contentStartRow < 0 || contentEndRow < 0 if (contentStartRow < 0) { - throw string("起始行或结束行分隔出错"); + throw string("起始行或结束行分隔出错(23)"); } contentEndRow = contentStartRow + 50; @@ -1115,7 +1154,7 @@ } //contentStartRow < 0 || contentEndRow < 0 if (contentStartRow < 0) { - throw string("起始行或结束行分隔出错"); + throw string("起始行或结束行分隔出错(24)"); } contentEndRow = contentStartRow + 50; @@ -1231,6 +1270,61 @@ } +void THSActionUtil::betchAddGP(HWND addDialog, list<string> codeList) +{ + //将代码写入txt文件 + string path = "D:\\gpcode\\gp.txt"; + ofstream ofs; + ofs.open(path, ios::trunc); + int index = 0; + for (list<string>::iterator ele = codeList.begin();ele != codeList.end();++ele) + { + index++; + ofs << *ele; + if (index < codeList.size()) + ofs << "\n"; + } + + Sleep(200); + addDialog = FindWindowExA(addDialog, NULL,"AfxWnd100s","CEFBrowser" ); + addDialog = FindWindowExA(addDialog, NULL, "CefBrowserWindow", NULL); + addDialog = FindWindowExA(addDialog, NULL, "Chrome_WidgetWin_0", NULL); + addDialog = FindWindowExA(addDialog, NULL, "Chrome_RenderWidgetHostHWND", NULL); + cout << "添加股票弹框:"<< addDialog << endl; + + + Win32Util::focus(addDialog); + //图片选择按钮 + SendMessage(addDialog, WM_LBUTTONDOWN, 0x00000001, 0x00370141); + SendMessage(addDialog, WM_LBUTTONUP, 0x00000000, 0x00370141); + Sleep(100); + //上传文件按钮 + SendMessage(addDialog, WM_LBUTTONDOWN, 0x00000001, 0x016000B1); + SendMessage(addDialog, WM_LBUTTONUP, 0x00000000, 0x016000B1); + + + HWND hwnd = HWND(0); + for (int i = 0;i < 10;i++) + { + HWND temp = FindWindowA("#32770", "打开"); + if (temp > 0) { + hwnd = temp; + break; + } + Sleep(1000); + } + + Win32Util::selectTexFileWin10(hwnd, "D:\\gpcode\\"); + Sleep(500); + Win32Util::focus(addDialog); + //点击添加全部按钮 + SendMessage(addDialog, WM_LBUTTONDOWN, 0x00000001, 0x00570139); + SendMessage(addDialog, WM_LBUTTONUP, 0x00000000, 0x00570139); + //关闭弹框 + HWND close = FindWindowA(0, "添加股票"); + SendMessage(close, WM_CLOSE, 0, 0); +} + std::list<GPCodeArea> THSActionUtil::getListenL2GPAreaAndCode(RecognitionManager* recognitionManager) { //截图当前有哪些股票代码 list<HWND> wlist = Win32Util::searchWindow("同花顺("); @@ -1251,7 +1345,7 @@ } } if (mainPage <= 0) { - throw string("L2监听未打开"); + throw string("L2监听未打开(25)"); } HWND content = FindWindowExA(mainPage, NULL, "AfxFrameOrView100s", NULL); @@ -1308,7 +1402,66 @@ return fresultList; +}void THSActionUtil::clearPlateCodes(HWND hwnd) +{ + HWND content = FindWindowExA(hwnd, NULL, "AfxFrameOrView100s", NULL); + for (int i = 0;i < 15;i++) + { + //截图识别是否还有代码 + cv::Mat oimg = CaptureUtil::capture(content); + if (oimg.cols <= 0 || oimg.rows <= 0) { + throw string("板块截屏内容为空(26)"); + } + + cv::Mat img = ImgUtil::grayImage(oimg); + oimg.release(); + std::list<GPCodeArea> areaList = recognitionGPArea(img); + cout << "数据数量:" << areaList.size() << endl; + if (areaList.size() <= 2) { + //执行最后一次删除 + Win32Util::focus(hwnd); + Win32Util::keyboard(VK_DELETE, 30); + break; + } + //执行删除事件 + for (int j = 0;j < 20;j++) { + Win32Util::focus(hwnd); + Win32Util::keyboard(VK_DELETE, 30); + } + } } + +RECT THSActionUtil::getPlateAddCodeBtnPostion(HWND win) +{ + //获取添加按钮位置 + HWND content = FindWindowExA(win, NULL, "AfxFrameOrView100s", NULL); + RECT contentRect; + GetWindowRect(content, &contentRect); + + cv::Mat oimg = CaptureUtil::capture(content); + + if (oimg.cols <= 0 || oimg.rows <= 0) { + throw string("板块截屏内容为空(27)"); + } + + cv::Mat img = ImgUtil::grayImage(oimg); + oimg.release(); + std::list<GPCodeArea> areaList = recognitionGPArea(img); + for (std::list<GPCodeArea>::iterator ele = areaList.begin();ele != areaList.end();ele++) { + cout << "添加按钮位置:" << (*ele).startx << "," << (*ele).starty << "," << (*ele).endx << "," << (*ele).endy << endl; + if ((*ele).type == IMG_TYPE_ADD) { + RECT rect; + rect.left = contentRect.left + (*ele).startx; + rect.right = contentRect.left + (*ele).endx; + rect.top = contentRect.top + (*ele).starty; + rect.bottom = contentRect.top + (*ele).endy; + return rect; + } + } + throw string("尚未找到添加按钮(28)"); +} + + bool THSActionUtil::setListenL2GP(int p, string code, RecognitionManager* recognitionManager) { @@ -1352,7 +1505,7 @@ } if (contentStartRow < 0) { - throw string("起始行分隔出错"); + throw string("起始行分隔出错(29)"); } //分隔列 @@ -1377,7 +1530,7 @@ } if (startC < 0 || endC < 0) { - throw string("内容框分隔出错"); + throw string("内容框分隔出错(30)"); } GPCodeArea area = GPCodeArea(); @@ -1387,4 +1540,56 @@ area.endy = rows - 1; return area; -} \ No newline at end of file +} + +void THSActionUtil::addTargetCodes(list<std::string> codeList, RecognitionManager* recognitionManager) +{ + //获取同花顺主页 + HWND win = getMainWin(); + Win32Util::focus(win); + //快捷键打开板块 + Win32Util::keyboardNum("51", 200); + Win32Util::keyboard(13, 10); + Sleep(1000); + //删除板块内的所有内容 + clearPlateCodes(win); + //获取添加按钮位置 + RECT codeArea = getPlateAddCodeBtnPostion(win); + //点击添加按钮 + Win32Util::click(codeArea.left + 5, codeArea.top + 3); + + //批量添加代码 + HWND addDLG; + for (int i = 0;i < 10;i++) { + addDLG = FindWindowA("#32770", "添加股票"); + if (addDLG > 0) { + break; + } + Sleep(1000); + } + if (addDLG <= 0) { + throw string("添加股票窗口打开失败(31)"); + } + if (codeList.size() >= 100) + { + betchAddGP(addDLG, codeList); + } + else { + //逐个添加 + for (list<std::string>::iterator ele = codeList.begin();ele != codeList.end();++ele) { + string code = *ele; + Win32Util::focus(addDLG); + for (int i = 0;i < 6;i++) + { + Win32Util::keyboard(VK_BACK, 10); + } + Win32Util::focus(addDLG); + Win32Util::keyboardNum(code, 1000); + Win32Util::focus(addDLG); + Win32Util::keyboard(VK_RETURN, 1500); + } + Sleep(100); + SendMessage(addDLG, WM_CLOSE, 0, 0); + } + //TODO 校验代码的正确性 +} -- Gitblit v1.8.0