CValueWnd.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368
  1. #include "../pch/pch.h"
  2. #include "CValueWnd.h"
  3. #include "../tool/CComHelper.h"
  4. #include "../tool/CSerialPort.h"
  5. #include "../helper/CBitmapHelper.h"
  6. #include "../network/CMessagePush.h"
  7. #include <atltypes.h>
  8. void RegKeyboardRawInput(HWND hWnd)
  9. {
  10. RAWINPUTDEVICE rawInputDevice[1];
  11. rawInputDevice[0].usUsagePage = 0x01;//设备类
  12. rawInputDevice[0].usUsage = 0x06;//设备类内的具体设备
  13. rawInputDevice[0].dwFlags = RIDEV_INPUTSINK;//意味着即使窗口失去焦点位置,仍然会一直接收输入消息
  14. rawInputDevice[0].hwndTarget = hWnd;
  15. if (RegisterRawInputDevices(rawInputDevice, 1, sizeof(rawInputDevice[0])) == FALSE)
  16. {
  17. printf("RegisterRawInputDevices failed");
  18. }
  19. }
  20. void CValueWnd::Notify(TNotifyUI& msg)
  21. {
  22. if(msg.sType == _T("click"))
  23. {
  24. if(msg.pSender->GetName() == _T("closebtn"))
  25. {
  26. PostQuitMessage(0);
  27. return;
  28. }
  29. }
  30. }
  31. void CValueWnd::Init()
  32. {
  33. //初始化窗口位置
  34. InitWndPos();
  35. //抢焦点
  36. std::thread(&CValueWnd::TopMostWnd, this).detach();
  37. //注册热键
  38. UpdateRegisterHotKey();
  39. //添加托盘图标
  40. AddTrayIcon();
  41. //登录成功,启动消息和任务处理
  42. m_push = new CMessagePush(m_hWnd);
  43. m_push->Start();
  44. //初始化菜单窗口
  45. pMenu = new CMenuWnd(this);
  46. pMenu->Create(NULL, L"智铺子收银插件菜单", WS_POPUP, WS_EX_TOOLWINDOW);
  47. pMenu->ShowWindow(false);
  48. //定位窗口的初始化
  49. pDingweiWnd = new CDingweiWnd();
  50. pDingweiWnd->Create(NULL, _T("智铺子收银插件窗口定位"), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW, 0, 0, 0, 0, NULL);
  51. pDingweiWnd->ShowWindow(false);
  52. pDingweiInfoWnd = new CDingweiInfoWnd(this);
  53. pDingweiInfoWnd->Create(NULL, _T("智铺子收银插件窗口定位信息"), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW, 0, 0, 0, 0, NULL);
  54. pDingweiInfoWnd->ShowWindow(false);
  55. //Ocr窗口初始化
  56. pOcrWnd = new COcrWnd(this);
  57. pOcrWnd->Create(NULL, _T("智铺子收银插件OCR定位"), UI_WNDSTYLE_FRAME, WS_EX_TOOLWINDOW , 0, 0, 0, 0, NULL);
  58. pOcrWnd->ShowWindow(false);
  59. //OCR的数据初始化
  60. if (m_tess.Init("./tessdata", "eng"))
  61. {
  62. LOG_INFO("OCRTesseract: Could not initialize tesseract.");
  63. MessageBox(m_hWnd, L"ocr语言库加载失败", L"错误", MB_OK);
  64. }
  65. m_tess.SetPageSegMode(tesseract::PageSegMode::PSM_SINGLE_LINE);
  66. m_tess.SetVariable("save_best_choices", "T");
  67. //再安装钩子
  68. BOOL ret = InstallHook();
  69. //开始启动监听
  70. RestartWatch();
  71. RegKeyboardRawInput(m_hWnd);
  72. }
  73. /*
  74. *抢窗口前端,抢焦点
  75. **/
  76. void CValueWnd::TopMostWnd()
  77. {
  78. while (true)
  79. {
  80. ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
  81. if (m_is_show_shoukuan && m_shoukuanHWND != NULL)
  82. {
  83. //::SendMessage(m_shoukuanHWND, WM_SHOUKUAN_UPDATE_FOCUS, NULL, NULL);
  84. }
  85. Sleep(300);
  86. }
  87. }
  88. void CValueWnd::RestartWatch()
  89. {
  90. std::thread(&CValueWnd::StartWatchWork, this).detach();
  91. }
  92. /*
  93. *根据当前数据库的设置,重启监听
  94. **/
  95. void CValueWnd::StartWatchWork()
  96. {
  97. //先暂停已有的监控
  98. m_isWatchWork = false;
  99. //等待2秒,这2秒就是等已有的监控线程自动退出
  100. Sleep(2000);
  101. //然后开始工作
  102. m_isWatchWork = true;
  103. std::string system_setting_jinezhuaqu_setting_type = CSetting::GetParam("system_setting_jinezhuaqu_setting_type");
  104. m_nWatchType = atoi(system_setting_jinezhuaqu_setting_type.c_str());
  105. if(m_nWatchType == 1)
  106. {
  107. //更新监听的端口号
  108. std::string system_setting_jinezhuaqu_setting_chuankou_num = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuankou_num");
  109. if(system_setting_jinezhuaqu_setting_chuankou_num == "")
  110. {
  111. //参数错误
  112. return;
  113. }
  114. std::wstring ws_system_setting_jinezhuaqu_setting_chuankou_num = CLewaimaiString::UTF8ToUnicode(system_setting_jinezhuaqu_setting_chuankou_num);
  115. //设置窗口句柄
  116. ::SetHwnd(m_hWnd);
  117. //设置串口端口号
  118. std::transform(system_setting_jinezhuaqu_setting_chuankou_num.begin(), system_setting_jinezhuaqu_setting_chuankou_num.end(), system_setting_jinezhuaqu_setting_chuankou_num.begin(), ::toupper);
  119. std::transform(ws_system_setting_jinezhuaqu_setting_chuankou_num.begin(), ws_system_setting_jinezhuaqu_setting_chuankou_num.end(), ws_system_setting_jinezhuaqu_setting_chuankou_num.begin(), ::toupper);
  120. ::SetComNum(system_setting_jinezhuaqu_setting_chuankou_num.c_str(), ws_system_setting_jinezhuaqu_setting_chuankou_num.c_str(), system_setting_jinezhuaqu_setting_chuankou_num.size());
  121. }
  122. else if(m_nWatchType == 2)
  123. {
  124. //虚拟串口的模式
  125. std::thread(&CValueWnd::ReadXunichuankouValue, this).detach();
  126. }
  127. else if(m_nWatchType == 3)
  128. {
  129. //窗口模式
  130. m_watchWnd = NULL;
  131. std::thread(&CValueWnd::WatchWnd, this).detach();
  132. }
  133. else if (m_nWatchType == 4)
  134. {
  135. std::thread(&CValueWnd::StartOcrWork, this).detach();
  136. }
  137. }
  138. /*
  139. *读取客显金额的线程,一旦m_nWatchType不为2,那么就直接退出这个线程,下次设置的时候再开启
  140. **/
  141. void CValueWnd::ReadXunichuankouValue()
  142. {
  143. //读取虚拟串口的模式
  144. std::string system_setting_jinezhuaqu_setting_xunichuankou_num_2 = CSetting::GetParam("system_setting_jinezhuaqu_setting_xunichuankou_num_2");
  145. std::string system_setting_jinezhuaqu_setting_xunichuankou_botelv = CSetting::GetParam("system_setting_jinezhuaqu_setting_xunichuankou_botelv");
  146. CSerialPort serial(CLewaimaiString::UTF8ToUnicode(system_setting_jinezhuaqu_setting_xunichuankou_num_2), atoi(system_setting_jinezhuaqu_setting_xunichuankou_botelv.c_str()));
  147. bool ret = serial.openComm();
  148. if(!ret)
  149. {
  150. LOG_INFO("open com failed!");
  151. return;
  152. }
  153. char a[1024] = { 0 };
  154. //检查监控模式和波特率,如果变了就关闭掉
  155. while(m_nWatchType == 2 && m_isWatchWork)
  156. {
  157. memset(a, 0, 1024);
  158. //开始读取串口的数据
  159. DWORD nReaded = 0;
  160. serial.readFromComm(a, 1024, &nReaded);
  161. if(nReaded > 0)
  162. {
  163. UpdateKexian(a, nReaded);
  164. }
  165. Sleep(200);
  166. }
  167. serial.closeComm();
  168. }
  169. void CValueWnd::WatchWnd()
  170. {
  171. std::string system_setting_jinezhuaqu_setting_chuangkou_process_name = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuangkou_process_name");
  172. std::string system_setting_jinezhuaqu_setting_chuangkou_title = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuangkou_title");
  173. std::string system_setting_jinezhuaqu_setting_chuangkou_zorder = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuangkou_zorder");
  174. //如果模式变了,或者参数变了,就退出(因为会重新启动一个新的监控)
  175. while(m_nWatchType == 3 && m_isWatchWork)
  176. {
  177. if(m_watchWnd != NULL)
  178. {
  179. std::wstring value;
  180. TCHAR szTitle[MAX_PATH] = { 0 };
  181. LPWSTR lpWindowName = szTitle;
  182. int ret = ::SendMessageW(m_watchWnd, WM_GETTEXT, (WPARAM)(MAX_PATH), (LPARAM)lpWindowName);
  183. if(ret == 0)
  184. {
  185. //说明m_watchWnd已经失效了
  186. value = L"0.00";
  187. m_watchWnd = NULL;
  188. }
  189. else
  190. {
  191. value = lpWindowName;
  192. //先对获取到的值做一下处理,删除掉人民币符号
  193. CLewaimaiString::Replace(value, L"¥", L"");
  194. }
  195. if(value != m_watchValue)
  196. {
  197. //保存下来窗口获取到的值
  198. m_watchValue = value;
  199. SendMessage(WM_WATCH_WND_UPDATE, NULL, NULL);
  200. }
  201. }
  202. else
  203. {
  204. //获得进程名字
  205. std::wstring processName = CLewaimaiString::UTF8ToUnicode(system_setting_jinezhuaqu_setting_chuangkou_process_name);
  206. //根据进程名字,找到对应的主窗口
  207. HWND mainWnd = GetWndHwnd(processName.c_str(), system_setting_jinezhuaqu_setting_chuangkou_title);
  208. if(mainWnd == NULL)
  209. {
  210. //说明这个进程还没有启动
  211. m_watchWnd = NULL;
  212. }
  213. else
  214. {
  215. //根据Z序查找目标窗口
  216. ValueWnd newWnd;
  217. newWnd.wndTitle = system_setting_jinezhuaqu_setting_chuangkou_title;
  218. newWnd.TopWnd = mainWnd;
  219. newWnd.z_order = atoi(system_setting_jinezhuaqu_setting_chuangkou_zorder.c_str());
  220. newWnd.processName = processName;
  221. newWnd.selfWnd = NULL;
  222. g_zorder = 0;
  223. EnumChildWindows(mainWnd, EnumMainwndChildProc, (LPARAM)(&newWnd));
  224. if(newWnd.selfWnd != NULL)
  225. {
  226. //找到了
  227. m_watchWnd = newWnd.selfWnd;
  228. }
  229. }
  230. }
  231. Sleep(200);
  232. }
  233. }
  234. void CValueWnd::StartOcrWork()
  235. {
  236. int system_setting_jinezhuaqu_setting_ocr_left = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_left").c_str());
  237. int system_setting_jinezhuaqu_setting_ocr_top = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_top").c_str());
  238. int system_setting_jinezhuaqu_setting_ocr_right = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_right").c_str());
  239. int system_setting_jinezhuaqu_setting_ocr_bottom = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_bottom").c_str());
  240. //如果模式变了,或者参数变了,就退出(因为会重新启动一个新的监控)
  241. while (m_nWatchType == 4 && m_isWatchWork)
  242. {
  243. RECT rect;
  244. rect.left = system_setting_jinezhuaqu_setting_ocr_left;
  245. rect.top = system_setting_jinezhuaqu_setting_ocr_top;
  246. rect.right = system_setting_jinezhuaqu_setting_ocr_right;
  247. rect.bottom = system_setting_jinezhuaqu_setting_ocr_bottom;
  248. if (IsRectEmpty(&rect))
  249. {
  250. }
  251. else
  252. {
  253. CBitmapHelper helper;
  254. std::string ocr_result;
  255. bool ret = helper.OcrRect(m_tess, &rect, ocr_result);
  256. if (ret)
  257. {
  258. if (!atof(ocr_result.c_str()))
  259. {
  260. //识别结果不是有效的数字
  261. CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
  262. valueLabel->SetText(L"0.00");
  263. }
  264. else
  265. {
  266. std::string format_value = CLewaimaiString::DoubleToString(atof(ocr_result.c_str()), 2);
  267. std::wstring ws_ocr_result = CLewaimaiString::UTF8ToUnicode(format_value);
  268. m_watchValue = ws_ocr_result;
  269. CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
  270. valueLabel->SetText(ws_ocr_result.c_str());
  271. }
  272. }
  273. }
  274. Sleep(200);
  275. }
  276. }
  277. LRESULT CValueWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  278. {
  279. LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
  280. styleValue &= ~WS_CAPTION;
  281. ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
  282. // 把自己的窗口句柄与窗口绘制管理器挂接在一起
  283. m_pm.Init(m_hWnd);
  284. m_pm.AddPreMessageFilter(this);
  285. CDialogBuilder builder;
  286. CControlUI* pRoot = builder.Create(_T("value.xml"), (UINT)0, NULL, &m_pm);
  287. ASSERT(pRoot && "Failed to parse XML");
  288. // 把这些控件绘制到本窗口上
  289. m_pm.AttachDialog(pRoot);
  290. // 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
  291. m_pm.AddNotifier(this);
  292. //进行一些初始化工作
  293. Init();
  294. return 0;
  295. }
  296. LRESULT CValueWnd::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  297. {
  298. bHandled = FALSE;
  299. return 0;
  300. }
  301. /*
  302. *这个是窗口被销毁的时候调用的
  303. **/
  304. LRESULT CValueWnd::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  305. {
  306. Shell_NotifyIcon(NIM_DELETE, &m_trayIcon);
  307. UnregisterHotKey(m_hWnd, WM_MYHOTKEY_SHOUKUAN);
  308. //注意这里不能delete,这个对象会delete自己
  309. m_push->Stop();
  310. bHandled = FALSE;
  311. return 0;
  312. }
  313. LRESULT CValueWnd::OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  314. {
  315. if(::IsIconic(*this))
  316. {
  317. bHandled = FALSE;
  318. }
  319. return (wParam == 0) ? TRUE : FALSE;
  320. }
  321. LRESULT CValueWnd::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  322. {
  323. return 0;
  324. }
  325. LRESULT CValueWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  326. {
  327. return 0;
  328. }
  329. LRESULT CValueWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  330. {
  331. POINT pt;
  332. pt.x = GET_X_LPARAM(lParam);
  333. pt.y = GET_Y_LPARAM(lParam);
  334. ::ScreenToClient(*this, &pt);
  335. RECT rcClient;
  336. ::GetClientRect(*this, &rcClient);
  337. RECT rcCaption = m_pm.GetCaptionRect();
  338. if(pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
  339. && pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
  340. {
  341. CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
  342. if(pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
  343. {
  344. return HTCAPTION;
  345. }
  346. }
  347. return HTCLIENT;
  348. }
  349. LRESULT CValueWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  350. {
  351. UINT dwSize = 0;
  352. GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));//取数据,第一次调用函数将获取需要的字节大小
  353. LPBYTE lpbBuffer = new BYTE[dwSize];//分配指定的缓冲区大小
  354. GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, (LPVOID)lpbBuffer, (PUINT)&dwSize, (UINT)sizeof(RAWINPUTHEADER));//第二次调用获取原始输入数据,读入lpbBuffer
  355. RAWINPUT * raw = (RAWINPUT *)lpbBuffer;
  356. if (raw->header.dwType == RIM_TYPEKEYBOARD)//这里可以截获所有键盘信息,如需区分不同的键盘输入信息,可以通过设备句柄判断。
  357. {
  358. if (raw->data.keyboard.Message == WM_KEYDOWN)
  359. {
  360. }
  361. else if (raw->data.keyboard.Message == WM_KEYUP)
  362. {
  363. char keytext[10] = { 0 };
  364. BYTE state[256] = { 0 };
  365. //通过虚拟键盘码得到名字
  366. ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
  367. string a = keytext;
  368. if (raw->data.keyboard.VKey >= 48 && raw->data.keyboard.VKey <= 57)
  369. {
  370. //只考虑数字
  371. if (m_is_start_catch == false)
  372. {
  373. m_is_start_catch = true;
  374. m_catch_string = "";
  375. char keytext[10] = { 0 };
  376. BYTE state[256] = { 0 };
  377. //通过虚拟键盘码得到名字
  378. ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
  379. m_catch_string += string(keytext);
  380. m_last_catch_clock = clock();
  381. }
  382. else
  383. {
  384. //已经是在抓取过程中了
  385. clock_t now = clock();
  386. double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
  387. if (total_t > 0.05)
  388. {
  389. //如果超过了50ms,说明是人工输入的了,就重置所有状态
  390. m_is_start_catch = false;
  391. m_catch_string = "";
  392. }
  393. else
  394. {
  395. char keytext[10] = { 0 };
  396. BYTE state[256] = { 0 };
  397. //通过虚拟键盘码得到名字
  398. ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
  399. m_catch_string += string(keytext);
  400. m_last_catch_clock = clock();
  401. }
  402. }
  403. }
  404. else if (raw->data.keyboard.VKey == 13)
  405. {
  406. //enter
  407. std::string last = m_catch_string;
  408. bool is_fukuanma = false;
  409. //判断是不是正常的付款码格式
  410. if (last.find("10") == 0 \
  411. || last.find("11") == 0 \
  412. || last.find("12") == 0 \
  413. || last.find("13") == 0 \
  414. || last.find("14") == 0 \
  415. || last.find("15") == 0)
  416. {
  417. //微信付款码
  418. is_fukuanma = true;
  419. }
  420. else if (last.find("25") == 0 \
  421. || last.find("26") == 0 \
  422. || last.find("27") == 0 \
  423. || last.find("28") == 0 \
  424. || last.find("29") == 0 \
  425. || last.find("30") == 0)
  426. {
  427. //支付宝付款码
  428. is_fukuanma = true;
  429. }
  430. if (is_fukuanma)
  431. {
  432. //得到一个合适的付款码
  433. if (m_is_show_shoukuan == false)
  434. {
  435. ShowShoukuan();
  436. }
  437. }
  438. //不管是不是正常的付款码,收到enter后,这里都清空重来
  439. m_is_start_catch = false;
  440. m_catch_string = "";
  441. }
  442. else
  443. {
  444. //这种直接忽略,重新开始
  445. m_is_start_catch = false;
  446. m_catch_string = "";
  447. }
  448. }
  449. }
  450. delete[] lpbBuffer;
  451. bHandled = true;
  452. return 0;
  453. }
  454. LRESULT CValueWnd::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  455. {
  456. pMenu->ShowWindow(false);
  457. bHandled = FALSE;
  458. return 0;
  459. }
  460. LRESULT CValueWnd::OnRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  461. {
  462. RECT rect;
  463. GetWindowRect(m_hWnd, &rect);
  464. ::SetWindowPos(pMenu->GetHWND(), HWND_NOTOPMOST, rect.left, rect.bottom - 3, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
  465. pMenu->ShowWindow(true);
  466. //右击后点别地可以清除“右击出来的菜单”
  467. SetForegroundWindow(pMenu->GetHWND());
  468. bHandled = FALSE;
  469. return 0;
  470. }
  471. LRESULT CValueWnd::OnKexianUpdate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  472. {
  473. //如果当前不是串口模式,直接忽略
  474. if(m_nWatchType != 1)
  475. {
  476. bHandled = TRUE;
  477. return true;
  478. }
  479. //收到了客显数据消息,读取客显数据
  480. char data[MAX_DATA_LENGTH] = { 0 };
  481. int data_length = 0;
  482. HookGetData(data, &data_length);
  483. if(data_length == 0)
  484. {
  485. bHandled = TRUE;
  486. return true;
  487. }
  488. UpdateKexian(data, data_length);
  489. bHandled = TRUE;
  490. return true;
  491. }
  492. LRESULT CValueWnd::OnWatchWndUpdate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  493. {
  494. CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
  495. std::string utf8_watch_value = CLewaimaiString::UnicodeToUTF8(m_watchValue);
  496. std::string money_show = CLewaimaiString::DoubleToString(atof(utf8_watch_value.c_str()), 2);
  497. valueLabel->SetText(CLewaimaiString::UTF8ToUnicode(money_show).c_str());
  498. return TRUE;
  499. }
  500. LRESULT CValueWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  501. {
  502. LRESULT lRes = 0;
  503. BOOL bHandled = TRUE;
  504. switch(uMsg)
  505. {
  506. case WM_CREATE:
  507. lRes = OnCreate(uMsg, wParam, lParam, bHandled);
  508. break;
  509. case WM_CLOSE:
  510. lRes = OnClose(uMsg, wParam, lParam, bHandled);
  511. break;
  512. case WM_DESTROY:
  513. lRes = OnDestroy(uMsg, wParam, lParam, bHandled);
  514. break;
  515. case WM_NCACTIVATE:
  516. lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
  517. break;
  518. case WM_NCLBUTTONDOWN:
  519. lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled);
  520. break;
  521. case WM_NCRBUTTONDOWN:
  522. lRes = OnRButtonDown(uMsg, wParam, lParam, bHandled);
  523. break;
  524. case WM_NCCALCSIZE:
  525. lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
  526. break;
  527. case WM_NCPAINT:
  528. lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
  529. break;
  530. case WM_NCHITTEST:
  531. lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
  532. break;
  533. case WM_SHOWTASK:
  534. lRes = OnTrayIcon(uMsg, wParam, lParam, bHandled);
  535. break;
  536. case WM_HOOK_MESSAGE:
  537. lRes = OnKexianUpdate(uMsg, wParam, lParam, bHandled);
  538. break;
  539. case WM_WATCH_WND_UPDATE:
  540. lRes = OnWatchWndUpdate(uMsg, wParam, lParam, bHandled);
  541. break;
  542. case WM_HOTKEY:
  543. lRes = OnHotKey(uMsg, wParam, lParam, bHandled);
  544. break;
  545. case WM_INPUT:
  546. lRes = OnInput(uMsg, wParam, lParam, bHandled);
  547. break;
  548. default:
  549. bHandled = FALSE;
  550. }
  551. if(bHandled)
  552. {
  553. return lRes;
  554. }
  555. if(m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
  556. {
  557. return lRes;
  558. }
  559. return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
  560. }
  561. LRESULT CValueWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
  562. {
  563. return false;
  564. }
  565. void CValueWnd::ShowShoukuan()
  566. {
  567. if (m_is_show_shoukuan == true)
  568. {
  569. return;
  570. }
  571. pMenu->ShowWindow(false);
  572. CShoukuanWnd* pShoukuanWnd = new CShoukuanWnd;
  573. if (pShoukuanWnd != NULL)
  574. {
  575. pShoukuanWnd->setValueWnd(this);
  576. pShoukuanWnd->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
  577. pShoukuanWnd->SetIcon(IDI_ICON_DUILIB);
  578. pShoukuanWnd->CenterWindow();
  579. ::SetWindowPos(pShoukuanWnd->GetHWND(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  580. m_is_show_shoukuan = true;
  581. m_shoukuanWnd = pShoukuanWnd;
  582. m_shoukuanHWND = pShoukuanWnd->GetHWND();
  583. //只要金额不为0,就初始化
  584. std::string utf8_watch_value = CLewaimaiString::UnicodeToUTF8(m_watchValue);
  585. if (atof(utf8_watch_value.c_str()) > 0.001)
  586. {
  587. std::string format_string = CLewaimaiString::DoubleToString(atof(utf8_watch_value.c_str()), 2);
  588. m_watchValue = CLewaimaiString::UTF8ToUnicode(format_string);
  589. pShoukuanWnd->InitMoney(m_watchValue);
  590. }
  591. if (m_is_start_catch && m_catch_string.length() == 18)
  592. {
  593. pShoukuanWnd->InitFukuanma(m_catch_string);
  594. }
  595. UINT ret = pShoukuanWnd->ShowModal();
  596. m_is_show_shoukuan = false;
  597. m_shoukuanWnd = NULL;
  598. m_shoukuanHWND = NULL;
  599. if (ret == IDOK)
  600. {
  601. }
  602. else if (ret == IDCANCEL)
  603. {
  604. }
  605. }
  606. }
  607. void CValueWnd::ShowTuikuan()
  608. {
  609. if (m_is_show_tuikuan == true)
  610. {
  611. return;
  612. }
  613. pMenu->ShowWindow(false);
  614. CTuikuanWnd* pTuikuanWnd = new CTuikuanWnd;
  615. if (pTuikuanWnd != NULL)
  616. {
  617. pTuikuanWnd->setValueWnd(this);
  618. pTuikuanWnd->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
  619. pTuikuanWnd->SetIcon(IDI_ICON_DUILIB);
  620. pTuikuanWnd->CenterWindow();
  621. ::SetWindowPos(pTuikuanWnd->GetHWND(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
  622. m_is_show_tuikuan = true;
  623. m_tuikuanWnd = pTuikuanWnd;
  624. m_tuikuanHWND = pTuikuanWnd->GetHWND();
  625. //只要金额不为0,就初始化
  626. std::string utf8_watch_value = CLewaimaiString::UnicodeToUTF8(m_watchValue);
  627. if (false)
  628. {
  629. std::string format_string = CLewaimaiString::DoubleToString(atof(utf8_watch_value.c_str()), 2);
  630. m_watchValue = CLewaimaiString::UTF8ToUnicode(format_string);
  631. pTuikuanWnd->InitMoney(m_watchValue);
  632. }
  633. UINT ret = pTuikuanWnd->ShowModal();
  634. m_is_show_tuikuan = false;
  635. m_tuikuanWnd = NULL;
  636. m_tuikuanHWND = NULL;
  637. if (ret == IDOK)
  638. {
  639. }
  640. else if (ret == IDCANCEL)
  641. {
  642. }
  643. }
  644. }
  645. void CValueWnd::AddTrayIcon()
  646. {
  647. memset(&m_trayIcon, 0, sizeof(NOTIFYICONDATA));
  648. m_trayIcon.cbSize = sizeof(NOTIFYICONDATA);
  649. m_trayIcon.hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON_DUILIB));
  650. m_trayIcon.hWnd = m_hWnd;
  651. lstrcpy(m_trayIcon.szTip, _T("智铺子收银插件"));
  652. m_trayIcon.uCallbackMessage = WM_SHOWTASK;
  653. m_trayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  654. Shell_NotifyIcon(NIM_ADD, &m_trayIcon);
  655. }
  656. LRESULT CValueWnd::OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  657. {
  658. //如果在图标中单击左键则还原
  659. if(lParam == WM_LBUTTONDOWN)
  660. {
  661. ShowTrayMenu();
  662. }
  663. //如果在图标中单击右键则弹出声明式菜单
  664. else if(lParam == WM_RBUTTONDOWN)
  665. {
  666. ShowTrayMenu();
  667. }
  668. bHandled = true;
  669. return 0;
  670. }
  671. LRESULT CValueWnd::OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  672. {
  673. UINT fuModifiers = (UINT)LOWORD(lParam);
  674. UINT uVirtKey = (UINT)HIWORD(lParam);
  675. //判断响应了什么热键
  676. if (wParam == WM_MYHOTKEY_SHOUKUAN)
  677. {
  678. if (m_is_show_setting == false)
  679. {
  680. ShowShoukuan();
  681. }
  682. }
  683. bHandled = TRUE;
  684. return 0;
  685. }
  686. void CValueWnd::ShowSystemSetting()
  687. {
  688. //先隐藏目录
  689. pMenu->ShowWindow(false);
  690. //然后判断和显示系统设置
  691. if (m_is_show_setting == true)
  692. {
  693. return;
  694. }
  695. CSystemSettingWnd* pSystemSettingFrame = new CSystemSettingWnd(this);
  696. m_settingWnd = pSystemSettingFrame;
  697. if (pSystemSettingFrame != NULL)
  698. {
  699. m_is_show_setting = true;
  700. pSystemSettingFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
  701. pSystemSettingFrame->SetIcon(IDI_ICON_DUILIB);
  702. pSystemSettingFrame->CenterWindow();
  703. UINT ret = pSystemSettingFrame->ShowModal();
  704. m_is_show_setting = false;
  705. if (ret == IDOK)
  706. {
  707. }
  708. else if (ret == IDCANCEL)
  709. {
  710. }
  711. }
  712. }
  713. void CValueWnd::ShowJiaoyijilu()
  714. {
  715. //先隐藏目录
  716. pMenu->ShowWindow(false);
  717. //然后判断和显示系统设置
  718. if (m_is_show_jiaoyijilu == true)
  719. {
  720. return;
  721. }
  722. CJiaoyijiluWnd* pJiaoyijiluFrame = new CJiaoyijiluWnd(this);
  723. m_jiaoyijiluWnd = pJiaoyijiluFrame;
  724. if (pJiaoyijiluFrame != NULL)
  725. {
  726. m_is_show_jiaoyijilu = true;
  727. pJiaoyijiluFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
  728. pJiaoyijiluFrame->SetIcon(IDI_ICON_DUILIB);
  729. pJiaoyijiluFrame->CenterWindow();
  730. UINT ret = pJiaoyijiluFrame->ShowModal();
  731. m_is_show_jiaoyijilu = false;
  732. if (ret == IDOK)
  733. {
  734. }
  735. else if (ret == IDCANCEL)
  736. {
  737. }
  738. }
  739. }
  740. void CValueWnd::ShowJiaoyihuizong()
  741. {
  742. //先隐藏目录
  743. pMenu->ShowWindow(false);
  744. //然后判断和显示系统设置
  745. if (m_is_show_jiaoyihuizong == true)
  746. {
  747. return;
  748. }
  749. CJiaoyihuizongWnd* pjiaoyihuizongFrame = new CJiaoyihuizongWnd(this);
  750. m_jiaoyihuizongWnd = pjiaoyihuizongFrame;
  751. if (pjiaoyihuizongFrame != NULL)
  752. {
  753. m_is_show_jiaoyihuizong = true;
  754. pjiaoyihuizongFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
  755. pjiaoyihuizongFrame->SetIcon(IDI_ICON_DUILIB);
  756. pjiaoyihuizongFrame->CenterWindow();
  757. UINT ret = pjiaoyihuizongFrame->ShowModal();
  758. m_is_show_jiaoyihuizong = false;
  759. if (ret == IDOK)
  760. {
  761. }
  762. else if (ret == IDCANCEL)
  763. {
  764. }
  765. }
  766. }
  767. void CValueWnd::ShowJiaoban()
  768. {
  769. //先隐藏目录
  770. pMenu->ShowWindow(false);
  771. //然后判断和显示系统设置
  772. if (m_is_show_jiaoban == true)
  773. {
  774. return;
  775. }
  776. CJiaobanWnd* pjiaobanFrame = new CJiaobanWnd(this);
  777. m_jiaobanWnd = pjiaobanFrame;
  778. if (pjiaobanFrame != NULL)
  779. {
  780. m_is_show_jiaoban = true;
  781. pjiaobanFrame->setValueWnd(this);
  782. pjiaobanFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
  783. pjiaobanFrame->SetIcon(IDI_ICON_DUILIB);
  784. pjiaobanFrame->CenterWindow();
  785. UINT ret = pjiaobanFrame->ShowModal();
  786. m_is_show_jiaoban = false;
  787. if (ret == IDOK)
  788. {
  789. }
  790. else if (ret == IDCANCEL)
  791. {
  792. }
  793. }
  794. }
  795. void CValueWnd::UpdateKexian(const char* data, int length)
  796. {
  797. std::string new_data = data;
  798. //清屏命令
  799. std::string clear_command = "\f";
  800. //4个信号灯全灭
  801. std::string quanmie_command = "\x1bs0";
  802. //初始化命令
  803. std::string init_command = "\x1b\x40";
  804. //实际读取金额用到的命令
  805. std::string show_command = "\x1bQA";
  806. std::string show_command_2 = "QA";
  807. std::string type_command = "\x1bs";
  808. if(new_data == clear_command || new_data == quanmie_command || new_data == init_command)
  809. {
  810. //清屏命令,或者是熄灭灯的命令
  811. return;
  812. }
  813. int nShowType;
  814. if(new_data.find(show_command) == new_data.npos)
  815. {
  816. //没有\x1bQA,继续找有没有QA(比如思迅)
  817. if (new_data.find(show_command_2) == new_data.npos)
  818. {
  819. //完全没QA
  820. return;
  821. }
  822. else
  823. {
  824. nShowType = 2;
  825. }
  826. }
  827. else
  828. {
  829. nShowType = 1;
  830. }
  831. std::string money;
  832. int nPos;
  833. if (nShowType == 1)
  834. {
  835. nPos = new_data.find(show_command);;
  836. }
  837. else
  838. {
  839. nPos = new_data.find(show_command_2);
  840. }
  841. int nTypePos = new_data.find(type_command, nPos + 1);
  842. if(nTypePos == new_data.npos)
  843. {
  844. //没有类型信息,有些收银机(比如思迅天店)就是不传类型信息,这种只有传什么显示什么了
  845. int nTabPos = new_data.find("\r", nPos + 1);
  846. if(nTabPos == new_data.npos)
  847. {
  848. //制表符也没有
  849. return;
  850. }
  851. if (nShowType == 1)
  852. {
  853. money = new_data.substr(nPos + 3, nTabPos - nPos - 3);
  854. }
  855. else
  856. {
  857. money = new_data.substr(nPos + 2, nTabPos - nPos - 2);
  858. }
  859. CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
  860. std::string money_show = CLewaimaiString::DoubleToString(atof(money.c_str()), 2);
  861. m_watchValue = CLewaimaiString::UTF8ToUnicode(money_show);
  862. valueLabel->SetText(CLewaimaiString::UTF8ToUnicode(money_show).c_str());
  863. }
  864. else
  865. {
  866. std::string value_type = new_data.substr(nTypePos + 2, 1);
  867. money = new_data.substr(nPos + 3, nTypePos - nPos - 3 - 1);
  868. if(value_type == "2")
  869. {
  870. //这个表示是总计的,那么就要刷新金额显示
  871. CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
  872. std::string money_show = CLewaimaiString::DoubleToString(atof(money.c_str()), 2);
  873. m_watchValue = CLewaimaiString::UTF8ToUnicode(money_show);
  874. valueLabel->SetText(CLewaimaiString::UTF8ToUnicode(money_show).c_str());
  875. }
  876. else
  877. {
  878. //这种情况传输的是一些找零、单价之类的信息,不更新客显金额
  879. }
  880. }
  881. return;
  882. }
  883. void CValueWnd::InitWndPos()
  884. {
  885. ASSERT(::IsWindow(m_hWnd));
  886. ASSERT((GetWindowStyle(m_hWnd)&WS_CHILD) == 0);
  887. RECT rcDlg = { 0 };
  888. ::GetWindowRect(m_hWnd, &rcDlg);
  889. RECT rcArea = { 0 };
  890. RECT rcCenter = { 0 };
  891. HWND hWnd = *this;
  892. HWND hWndParent = ::GetParent(m_hWnd);
  893. HWND hWndCenter = ::GetWindowOwner(m_hWnd);
  894. if(hWndCenter != NULL)
  895. {
  896. hWnd = hWndCenter;
  897. }
  898. // 处理多显示器模式下屏幕居中
  899. MONITORINFO oMonitor = {};
  900. oMonitor.cbSize = sizeof(oMonitor);
  901. ::GetMonitorInfo(::MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST), &oMonitor);
  902. rcArea = oMonitor.rcWork;
  903. if(hWndCenter == NULL)
  904. {
  905. rcCenter = rcArea;
  906. }
  907. else
  908. {
  909. ::GetWindowRect(hWndCenter, &rcCenter);
  910. }
  911. int DlgWidth = rcDlg.right - rcDlg.left;
  912. int DlgHeight = rcDlg.bottom - rcDlg.top;
  913. int xLeft = rcCenter.right - DlgWidth - 60;
  914. int yTop = 100;
  915. if(xLeft < rcArea.left)
  916. {
  917. xLeft = rcArea.left;
  918. }
  919. else if(xLeft + DlgWidth > rcArea.right)
  920. {
  921. xLeft = rcArea.right - DlgWidth;
  922. }
  923. if(yTop < rcArea.top)
  924. {
  925. yTop = rcArea.top;
  926. }
  927. else if(yTop + DlgHeight > rcArea.bottom)
  928. {
  929. yTop = rcArea.bottom - DlgHeight;
  930. }
  931. ::SetWindowPos(m_hWnd, HWND_TOPMOST, xLeft, yTop, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
  932. }
  933. void CValueWnd::ShowTrayMenu()
  934. {
  935. //获取鼠标坐标
  936. POINT pt;
  937. GetCursorPos(&pt);
  938. CRect rect;
  939. GetWindowRect(pMenu->GetHWND(), &rect);
  940. int height = rect.bottom - rect.top;
  941. //显示目录
  942. ::SetWindowPos(pMenu->GetHWND(), HWND_NOTOPMOST, pt.x, pt.y - 15 - height, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
  943. pMenu->ShowWindow(true);
  944. SetFocus(pMenu->GetHWND());
  945. //右击后点别地可以清除“右击出来的菜单”
  946. SetForegroundWindow(pMenu->GetHWND());
  947. }
  948. void CValueWnd::StartDingweiWnd()
  949. {
  950. m_settingWnd->ShowWindow(false);
  951. m_is_dingwei_wnd = true;
  952. std::thread(&CValueWnd::StartDingweiWork, this).detach();
  953. }
  954. void CValueWnd::ConfirmDingweiWnd(std::wstring value, HWND hWnd)
  955. {
  956. m_is_dingwei_wnd = false;
  957. m_settingWnd->SetDingweiWnd(value, hWnd);
  958. }
  959. void CValueWnd::CancalDingweiWnd()
  960. {
  961. m_is_dingwei_wnd = false;
  962. }
  963. void CValueWnd::StartDingweiWork()
  964. {
  965. while (m_is_dingwei_wnd)
  966. {
  967. //这个时候,是开始定位窗口了
  968. POINT pt;
  969. GetCursorPos(&pt);
  970. //将屏幕坐标保存起来
  971. POINT ptScreen = pt;
  972. //转换成桌面坐标
  973. HWND hDeskHandle = GetDesktopWindow();
  974. ScreenToClient(hDeskHandle, &pt);
  975. HWND hParent = hDeskHandle;
  976. HWND hChild = ChildWindowFromPointEx(hParent, pt, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT | CWP_SKIPDISABLED);
  977. if (hChild == pDingweiInfoWnd->GetHWND())
  978. {
  979. //这里表示是移动信息窗口了,这里就不要执行后面的刷新操作了
  980. }
  981. else
  982. {
  983. while (hChild != NULL && hChild != hParent)
  984. {
  985. //说明还有更下级的子窗口
  986. hParent = hChild;
  987. pt = ptScreen;
  988. ScreenToClient(hParent, &pt);
  989. hChild = ChildWindowFromPointEx(hParent, pt, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
  990. }
  991. HWND hWnd = hParent;
  992. RECT rect;
  993. GetWindowRect(hWnd, &rect);
  994. //在这个窗口上,画一个边框
  995. pDingweiWnd->ShowWindow(true);
  996. ::SetWindowPos(pDingweiWnd->GetHWND(), HWND_TOPMOST, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOACTIVATE);
  997. //显示定位信息
  998. TCHAR szTitle[MAX_PATH] = { 0 };
  999. LPWSTR lpWindowName = szTitle;
  1000. ::SendMessageW(hWnd, WM_GETTEXT, (WPARAM)(MAX_PATH), (LPARAM)lpWindowName);
  1001. //设置信息窗口的内容
  1002. pDingweiInfoWnd->UpdateInfo(lpWindowName, hWnd);
  1003. pDingweiInfoWnd->ShowWindow(true);
  1004. int nWidth = rect.right - rect.left;
  1005. if (nWidth < 380)
  1006. {
  1007. nWidth = 380;
  1008. }
  1009. ::SetWindowPos(pDingweiInfoWnd->GetHWND(), HWND_TOPMOST, rect.left, rect.bottom, nWidth, 36, SWP_NOACTIVATE);
  1010. }
  1011. Sleep(100);
  1012. }
  1013. m_settingWnd->ShowWindow(true);
  1014. pDingweiWnd->ShowWindow(false);
  1015. pDingweiInfoWnd->ShowWindow(false);
  1016. }
  1017. void CValueWnd::StartOcrWnd()
  1018. {
  1019. m_settingWnd->ShowWindow(false);
  1020. m_is_orc_wnd = true;
  1021. pOcrWnd->ShowWindow(true);
  1022. //先默认居中
  1023. ::SetWindowPos(pOcrWnd->GetHWND(), HWND_TOPMOST, 0, 0, 320, 80, SWP_NOMOVE | SWP_NOACTIVATE);
  1024. pOcrWnd->CenterWindow();
  1025. }
  1026. void CValueWnd::ConfirmOcrWnd(RECT rect)
  1027. {
  1028. m_is_orc_wnd = false;
  1029. pOcrWnd->ShowWindow(false);
  1030. //保存截屏的结果
  1031. m_settingWnd->SetOcrWnd(rect);
  1032. //显示设置窗口
  1033. m_settingWnd->ShowWindow(true);
  1034. }
  1035. void CValueWnd::CancelOcr()
  1036. {
  1037. m_is_orc_wnd = false;
  1038. pOcrWnd->ShowWindow(false);
  1039. //显示设置窗口
  1040. m_settingWnd->ShowWindow(true);
  1041. }
  1042. tesseract::TessBaseAPI& CValueWnd::GetTess()
  1043. {
  1044. return m_tess;
  1045. }
  1046. bool CValueWnd::UpdateRegisterHotKey()
  1047. {
  1048. UINT shoukuan_mod = (UINT)atoi(CSetting::GetParam("system_setting_kuaijiejian_shoukuan_mod").c_str());
  1049. UINT shoukuan_vk = (UINT)atoi(CSetting::GetParam("system_setting_kuaijiejian_shoukuan_vk").c_str());
  1050. //先卸载旧的,再注册新的
  1051. UnregisterHotKey(m_hWnd, WM_MYHOTKEY_SHOUKUAN);
  1052. int nRet = RegisterHotKey(m_hWnd, WM_MYHOTKEY_SHOUKUAN, shoukuan_mod, shoukuan_vk);
  1053. return nRet;
  1054. }
  1055. void CValueWnd::PrintTest()
  1056. {
  1057. m_push->AddPrinter("", 3);
  1058. }
  1059. void CValueWnd::PrintZhifu(std::string out_trade_no)
  1060. {
  1061. m_push->AddPrinter(out_trade_no, 1);
  1062. }
  1063. void CValueWnd::PrintTuikuan(std::string out_trade_no)
  1064. {
  1065. m_push->AddPrinter(out_trade_no, 2);
  1066. }
  1067. void CValueWnd::PrintJiaoban(CJiaobanMessage& message)
  1068. {
  1069. m_push->AddPrinter(message);
  1070. }