| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434 |
- #include "../pch/pch.h"
- #include "CValueWnd.h"
- #include "../tool/CComHelper.h"
- #include "../tool/CSerialPort.h"
- #include "../helper/CBitmapHelper.h"
- #include "../network/CMessagePush.h"
- #include "CLoginWnd.h"
- void CValueWnd::Notify(TNotifyUI& msg)
- {
- if(msg.sType == _T("click"))
- {
- if(msg.pSender->GetName() == _T("closebtn"))
- {
- PostQuitMessage(0);
- return;
- }
- }
- }
- void CValueWnd::Init()
- {
- //初始化窗口位置
- InitWndPos();
- //抢焦点
- std::thread(&CValueWnd::TopMostWnd, this).detach();
- //任务+1
- m_nTaskNum++;
- //注册热键
- UpdateRegisterHotKey();
- //添加托盘图标
- AddTrayIcon();
- //登录成功,启动消息和任务处理
- m_push = new CMessagePush(m_hWnd);
- m_push->Start();
- //初始化菜单窗口
- pMenu = new CMenuWnd(this);
- pMenu->Create(NULL, L"智铺子收银插件菜单", WS_POPUP, WS_EX_TOOLWINDOW);
- pMenu->ShowWindow(false);
- //定位窗口的初始化
- pDingweiWnd = new CDingweiWnd();
- pDingweiWnd->Create(NULL, _T("智铺子收银插件窗口定位"), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW, 0, 0, 0, 0, NULL);
- pDingweiWnd->ShowWindow(false);
- pDingweiInfoWnd = new CDingweiInfoWnd(this);
- pDingweiInfoWnd->Create(NULL, _T("智铺子收银插件窗口定位信息"), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW, 0, 0, 0, 0, NULL);
- pDingweiInfoWnd->ShowWindow(false);
- //Ocr窗口初始化
- pOcrWnd = new COcrWnd(this);
- pOcrWnd->Create(NULL, _T("智铺子收银插件OCR定位"), UI_WNDSTYLE_FRAME, WS_EX_TOOLWINDOW , 0, 0, 0, 0, NULL);
- pOcrWnd->ShowWindow(false);
- //OCR的数据初始化
- if (m_tess.Init("./tessdata", "eng"))
- {
- LOG_INFO("OCRTesseract: Could not initialize tesseract.");
- MessageBox(m_hWnd, L"ocr语言库加载失败", L"错误", MB_OK);
- }
- m_tess.SetPageSegMode(tesseract::PageSegMode::PSM_SINGLE_LINE);
- m_tess.SetVariable("save_best_choices", "T");
- //开启键盘输入监听
- RegKeyboardRawInput();
- //再安装钩子
- BOOL ret = InstallHook();
- //开始启动监听
- RestartWatch();
- }
- /*
- *抢窗口前端,抢焦点
- **/
- void CValueWnd::TopMostWnd()
- {
- while (m_is_quit == false)
- {
- ::SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
- if (m_is_show_shoukuan && m_shoukuanWnd != NULL)
- {
- ::SendMessage(m_shoukuanWnd->GetHWND(), WM_SHOUKUAN_UPDATE_FOCUS, NULL, NULL);
- }
- Sleep(100);
- }
- m_nTaskNum--;
- //线程退出
- }
- void CValueWnd::RestartWatch()
- {
- std::thread(&CValueWnd::StartWatchWork, this).detach();
- }
- void CValueWnd::StopWatch()
- {
- m_isWatchWork = false;
- while (m_is_xunichuangkou_working || m_is_chuangkou_working || m_is_orc_working)
- {
- //等这3个线程全部退出
- Sleep(100);
- }
- }
- /*
- *根据当前数据库的设置,重启监听
- **/
- void CValueWnd::StartWatchWork()
- {
- //先暂停已有的监控
- StopWatch();
- //然后开始工作
- m_isWatchWork = true;
- std::string system_setting_jinezhuaqu_setting_type = CSetting::GetParam("system_setting_jinezhuaqu_setting_type");
- m_nWatchType = atoi(system_setting_jinezhuaqu_setting_type.c_str());
- if(m_nWatchType == 1)
- {
- //更新监听的端口号
- std::string system_setting_jinezhuaqu_setting_chuankou_num = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuankou_num");
- if(system_setting_jinezhuaqu_setting_chuankou_num == "")
- {
- //参数错误
- return;
- }
- std::wstring ws_system_setting_jinezhuaqu_setting_chuankou_num = CLewaimaiString::UTF8ToUnicode(system_setting_jinezhuaqu_setting_chuankou_num);
- //设置窗口句柄
- ::SetHwnd(m_hWnd);
- //设置串口端口号
- std::transform(system_setting_jinezhuaqu_setting_chuankou_num.begin(), system_setting_jinezhuaqu_setting_chuankou_num.end(), system_setting_jinezhuaqu_setting_chuankou_num.begin(), ::toupper);
- 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);
- ::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());
- }
- else if(m_nWatchType == 2)
- {
- //虚拟串口的模式
- std::thread(&CValueWnd::ReadXunichuankouValue, this).detach();
- }
- else if(m_nWatchType == 3)
- {
- //窗口模式
- m_watchWnd = NULL;
- std::thread(&CValueWnd::WatchWnd, this).detach();
- }
- else if (m_nWatchType == 4)
- {
- std::thread(&CValueWnd::StartOcrWork, this).detach();
- }
- }
- /*
- *读取客显金额的线程,一旦m_nWatchType不为2,那么就直接退出这个线程,下次设置的时候再开启
- **/
- void CValueWnd::ReadXunichuankouValue()
- {
- //读取虚拟串口的模式
- std::string system_setting_jinezhuaqu_setting_xunichuankou_num_2 = CSetting::GetParam("system_setting_jinezhuaqu_setting_xunichuankou_num_2");
- std::string system_setting_jinezhuaqu_setting_xunichuankou_botelv = CSetting::GetParam("system_setting_jinezhuaqu_setting_xunichuankou_botelv");
- CSerialPort serial(CLewaimaiString::UTF8ToUnicode(system_setting_jinezhuaqu_setting_xunichuankou_num_2), atoi(system_setting_jinezhuaqu_setting_xunichuankou_botelv.c_str()));
- bool ret = serial.openComm();
- if(!ret)
- {
- LOG_INFO("open com failed!");
- return;
- }
- m_is_xunichuangkou_working = true;
- char a[1024] = { 0 };
- //检查监控模式和波特率,如果变了就关闭掉
- while(m_nWatchType == 2 && m_isWatchWork)
- {
- memset(a, 0, 1024);
- //开始读取串口的数据
- DWORD nReaded = 0;
- serial.readFromComm(a, 1024, &nReaded);
- if(nReaded > 0)
- {
- UpdateKexian(a, nReaded);
- }
- Sleep(200);
- }
- serial.closeComm();
- m_is_xunichuangkou_working = false;
- }
- void CValueWnd::WatchWnd()
- {
- m_is_chuangkou_working = true;
- std::string system_setting_jinezhuaqu_setting_chuangkou_process_name = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuangkou_process_name");
- std::string system_setting_jinezhuaqu_setting_chuangkou_title = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuangkou_title");
- std::string system_setting_jinezhuaqu_setting_chuangkou_zorder = CSetting::GetParam("system_setting_jinezhuaqu_setting_chuangkou_zorder");
- //如果模式变了,或者参数变了,就退出(因为会重新启动一个新的监控)
- while(m_nWatchType == 3 && m_isWatchWork)
- {
- if(m_watchWnd != NULL)
- {
- std::wstring value;
- TCHAR szTitle[MAX_PATH] = { 0 };
- LPWSTR lpWindowName = szTitle;
- int ret = ::SendMessageW(m_watchWnd, WM_GETTEXT, (WPARAM)(MAX_PATH), (LPARAM)lpWindowName);
- if(ret == 0)
- {
- //说明m_watchWnd已经失效了
- value = L"0.00";
- m_watchWnd = NULL;
- }
- else
- {
- value = lpWindowName;
- //先对获取到的值做一下处理,删除掉人民币符号
- CLewaimaiString::Replace(value, L"¥", L"");
- }
- if(value != m_watchValue)
- {
- //保存下来窗口获取到的值
- m_watchValue = value;
- SendMessage(WM_WATCH_WND_UPDATE, NULL, NULL);
- }
- }
- else
- {
- //获得进程名字
- std::wstring processName = CLewaimaiString::UTF8ToUnicode(system_setting_jinezhuaqu_setting_chuangkou_process_name);
- //根据进程名字,找到对应的主窗口
- HWND mainWnd = GetWndHwnd(processName.c_str(), system_setting_jinezhuaqu_setting_chuangkou_title);
- if(mainWnd == NULL)
- {
- //说明这个进程还没有启动
- m_watchWnd = NULL;
- }
- else
- {
- //根据Z序查找目标窗口
- ValueWnd newWnd;
- newWnd.wndTitle = system_setting_jinezhuaqu_setting_chuangkou_title;
- newWnd.TopWnd = mainWnd;
- newWnd.z_order = atoi(system_setting_jinezhuaqu_setting_chuangkou_zorder.c_str());
- newWnd.processName = processName;
- newWnd.selfWnd = NULL;
- g_zorder = 0;
- EnumChildWindows(mainWnd, EnumMainwndChildProc, (LPARAM)(&newWnd));
- if(newWnd.selfWnd != NULL)
- {
- //找到了
- m_watchWnd = newWnd.selfWnd;
- }
- }
- }
- Sleep(200);
- }
- m_is_chuangkou_working = false;
- }
- void CValueWnd::StartOcrWork()
- {
- m_is_orc_working = true;
- int system_setting_jinezhuaqu_setting_ocr_left = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_left").c_str());
- int system_setting_jinezhuaqu_setting_ocr_top = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_top").c_str());
- int system_setting_jinezhuaqu_setting_ocr_right = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_right").c_str());
- int system_setting_jinezhuaqu_setting_ocr_bottom = atoi(CSetting::GetParam("system_setting_jinezhuaqu_setting_ocr_bottom").c_str());
- //如果模式变了,或者参数变了,就退出(因为会重新启动一个新的监控)
- while (m_nWatchType == 4 && m_isWatchWork)
- {
- RECT rect;
- rect.left = system_setting_jinezhuaqu_setting_ocr_left;
- rect.top = system_setting_jinezhuaqu_setting_ocr_top;
- rect.right = system_setting_jinezhuaqu_setting_ocr_right;
- rect.bottom = system_setting_jinezhuaqu_setting_ocr_bottom;
- if (IsRectEmpty(&rect))
- {
-
- }
- else
- {
- CBitmapHelper helper;
- std::string ocr_result;
- bool ret = helper.OcrRect(m_tess, &rect, ocr_result);
- if (ret)
- {
- if (!atof(ocr_result.c_str()))
- {
- //识别结果不是有效的数字
- CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
- valueLabel->SetText(L"0.00");
- }
- else
- {
- std::string format_value = CLewaimaiString::DoubleToString(atof(ocr_result.c_str()), 2);
- std::wstring ws_ocr_result = CLewaimaiString::UTF8ToUnicode(format_value);
- m_watchValue = ws_ocr_result;
- CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
- valueLabel->SetText(ws_ocr_result.c_str());
- }
- }
- }
- Sleep(200);
- }
- m_is_orc_working = false;
- }
- LRESULT CValueWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
- styleValue &= ~WS_CAPTION;
- ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
- // 把自己的窗口句柄与窗口绘制管理器挂接在一起
- m_pm.Init(m_hWnd);
- m_pm.AddPreMessageFilter(this);
- CDialogBuilder builder;
- CControlUI* pRoot = builder.Create(_T("value.xml"), (UINT)0, NULL, &m_pm);
- ASSERT(pRoot && "Failed to parse XML");
- // 把这些控件绘制到本窗口上
- m_pm.AttachDialog(pRoot);
- // 把自己加入到CPaintManagerUI的m_aNotifiers数组中,用于处理Notify函数
- m_pm.AddNotifier(this);
- //进行一些初始化工作
- Init();
- return 0;
- }
- LRESULT CValueWnd::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- /*
- *这个是窗口被销毁的时候调用的
- **/
- LRESULT CValueWnd::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- bHandled = FALSE;
- return 0;
- }
- LRESULT CValueWnd::OnNcActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- if(::IsIconic(*this))
- {
- bHandled = FALSE;
- }
- return (wParam == 0) ? TRUE : FALSE;
- }
- LRESULT CValueWnd::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- return 0;
- }
- LRESULT CValueWnd::OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- return 0;
- }
- LRESULT CValueWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- POINT pt;
- pt.x = GET_X_LPARAM(lParam);
- pt.y = GET_Y_LPARAM(lParam);
- ::ScreenToClient(*this, &pt);
- RECT rcClient;
- ::GetClientRect(*this, &rcClient);
- RECT rcCaption = m_pm.GetCaptionRect();
- if(pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
- && pt.y >= rcCaption.top && pt.y < rcCaption.bottom)
- {
- CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
- if(pControl && _tcscmp(pControl->GetClass(), DUI_CTR_BUTTON) != 0)
- {
- return HTCAPTION;
- }
- }
- return HTCLIENT;
- }
- LRESULT CValueWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- UINT dwSize = 0;
- GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));//取数据,第一次调用函数将获取需要的字节大小
- LPBYTE lpbBuffer = new BYTE[dwSize];//分配指定的缓冲区大小
- GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, (LPVOID)lpbBuffer, (PUINT)&dwSize, (UINT)sizeof(RAWINPUTHEADER));//第二次调用获取原始输入数据,读入lpbBuffer
- RAWINPUT * raw = (RAWINPUT *)lpbBuffer;
- if (raw->header.dwType == RIM_TYPEKEYBOARD)//这里可以截获所有键盘信息,如需区分不同的键盘输入信息,可以通过设备句柄判断。
- {
- if (raw->data.keyboard.Message == WM_KEYDOWN)
- {
-
- }
- else if (raw->data.keyboard.Message == WM_KEYUP)
- {
- char keytext[10] = { 0 };
- BYTE state[256] = { 0 };
- //通过虚拟键盘码得到名字
- ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
- string a = keytext;
- if (raw->data.keyboard.VKey >= 48 && raw->data.keyboard.VKey <= 57)
- {
- //只考虑数字
- if (m_is_start_catch == false)
- {
- m_is_start_catch = true;
- m_catch_string = "";
- char keytext[10] = { 0 };
- BYTE state[256] = { 0 };
- //通过虚拟键盘码得到名字
- ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
- m_catch_string += string(keytext);
- m_last_catch_clock = clock();
- }
- else
- {
- //已经是在抓取过程中了
- clock_t now = clock();
- double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
- if (total_t > 0.05)
- {
- //如果超过了50ms,说明是人工输入的了,就重置所有状态
- m_is_start_catch = false;
- m_catch_string = "";
- }
- else
- {
- char keytext[10] = { 0 };
- BYTE state[256] = { 0 };
- //通过虚拟键盘码得到名字
- ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
- m_catch_string += string(keytext);
- m_last_catch_clock = clock();
- }
- }
- }
- else if (raw->data.keyboard.VKey == 13)
- {
- //enter
- std::string last = m_catch_string;
- bool is_fukuanma = false;
- //判断是不是正常的付款码格式
- if (last.find("10") == 0 \
- || last.find("11") == 0 \
- || last.find("12") == 0 \
- || last.find("13") == 0 \
- || last.find("14") == 0 \
- || last.find("15") == 0)
- {
- //微信付款码
- is_fukuanma = true;
- }
- else if (last.find("25") == 0 \
- || last.find("26") == 0 \
- || last.find("27") == 0 \
- || last.find("28") == 0 \
- || last.find("29") == 0 \
- || last.find("30") == 0)
- {
- //支付宝付款码
- is_fukuanma = true;
- }
- if (is_fukuanma)
- {
- //得到一个合适的付款码
- if (m_is_show_shoukuan == false)
- {
- ShowShoukuan();
- }
- }
- //不管是不是正常的付款码,收到enter后,这里都清空重来
- m_is_start_catch = false;
- m_catch_string = "";
- }
- else
- {
- //这种直接忽略,重新开始
- m_is_start_catch = false;
- m_catch_string = "";
- }
- }
- }
- delete[] lpbBuffer;
- bHandled = true;
- return 0;
- }
- LRESULT CValueWnd::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- pMenu->ShowWindow(false);
- bHandled = FALSE;
- return 0;
- }
- LRESULT CValueWnd::OnRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- RECT rect;
- GetWindowRect(m_hWnd, &rect);
- ::SetWindowPos(pMenu->GetHWND(), HWND_NOTOPMOST, rect.left, rect.bottom - 3, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
- pMenu->ShowWindow(true);
- //右击后点别地可以清除“右击出来的菜单”
- SetForegroundWindow(pMenu->GetHWND());
- bHandled = FALSE;
- return 0;
- }
- LRESULT CValueWnd::OnKexianUpdate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- //如果当前不是串口模式,直接忽略
- if(m_nWatchType != 1)
- {
- bHandled = TRUE;
- return true;
- }
- //收到了客显数据消息,读取客显数据
- char data[MAX_DATA_LENGTH] = { 0 };
- int data_length = 0;
- HookGetData(data, &data_length);
- if(data_length == 0)
- {
- bHandled = TRUE;
- return true;
- }
- UpdateKexian(data, data_length);
- bHandled = TRUE;
- return true;
- }
- LRESULT CValueWnd::OnWatchWndUpdate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
- std::string utf8_watch_value = CLewaimaiString::UnicodeToUTF8(m_watchValue);
- std::string money_show = CLewaimaiString::DoubleToString(atof(utf8_watch_value.c_str()), 2);
- valueLabel->SetText(CLewaimaiString::UTF8ToUnicode(money_show).c_str());
- return TRUE;
- }
- LRESULT CValueWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- LRESULT lRes = 0;
- BOOL bHandled = TRUE;
- switch(uMsg)
- {
- case WM_CREATE:
- lRes = OnCreate(uMsg, wParam, lParam, bHandled);
- break;
- case WM_CLOSE:
- lRes = OnClose(uMsg, wParam, lParam, bHandled);
- break;
- case WM_DESTROY:
- lRes = OnDestroy(uMsg, wParam, lParam, bHandled);
- break;
- case WM_NCACTIVATE:
- lRes = OnNcActivate(uMsg, wParam, lParam, bHandled);
- break;
- case WM_NCLBUTTONDOWN:
- lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled);
- break;
- case WM_NCRBUTTONDOWN:
- lRes = OnRButtonDown(uMsg, wParam, lParam, bHandled);
- break;
- case WM_NCCALCSIZE:
- lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled);
- break;
- case WM_NCPAINT:
- lRes = OnNcPaint(uMsg, wParam, lParam, bHandled);
- break;
- case WM_NCHITTEST:
- lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled);
- break;
- case WM_SHOWTASK:
- lRes = OnTrayIcon(uMsg, wParam, lParam, bHandled);
- break;
- case WM_HOOK_MESSAGE:
- lRes = OnKexianUpdate(uMsg, wParam, lParam, bHandled);
- break;
- case WM_WATCH_WND_UPDATE:
- lRes = OnWatchWndUpdate(uMsg, wParam, lParam, bHandled);
- break;
- case WM_HOTKEY:
- lRes = OnHotKey(uMsg, wParam, lParam, bHandled);
- break;
- case WM_INPUT:
- lRes = OnInput(uMsg, wParam, lParam, bHandled);
- break;
- default:
- bHandled = FALSE;
- }
- if(bHandled)
- {
- return lRes;
- }
- if(m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
- {
- return lRes;
- }
- return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
- }
- LRESULT CValueWnd::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)
- {
- return false;
- }
- void CValueWnd::ShowShoukuan()
- {
- if (m_is_show_shoukuan == true)
- {
- return;
- }
- pMenu->ShowWindow(false);
- CShoukuanWnd* pShoukuanWnd = new CShoukuanWnd;
- if (pShoukuanWnd != NULL)
- {
- pShoukuanWnd->setValueWnd(this);
- pShoukuanWnd->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
- pShoukuanWnd->SetIcon(IDI_ICON_DUILIB);
- pShoukuanWnd->CenterWindow();
- m_is_show_shoukuan = true;
- m_shoukuanWnd = pShoukuanWnd;
- //只要金额不为0,就初始化
- std::string utf8_watch_value = CLewaimaiString::UnicodeToUTF8(m_watchValue);
- if (atof(utf8_watch_value.c_str()) > 0.001)
- {
- std::string format_string = CLewaimaiString::DoubleToString(atof(utf8_watch_value.c_str()), 2);
- m_watchValue = CLewaimaiString::UTF8ToUnicode(format_string);
- pShoukuanWnd->InitMoney(m_watchValue);
- }
- if (m_is_start_catch && m_catch_string.length() == 18)
- {
- pShoukuanWnd->InitFukuanma(m_catch_string);
- }
- pShoukuanWnd->ShowWindow(true);
- }
- }
- void CValueWnd::CloseShoukuan()
- {
- m_is_show_shoukuan = false;
- m_shoukuanWnd->Close();
- m_shoukuanWnd = NULL;
- }
- void CValueWnd::ShowTuikuan()
- {
- if (m_is_show_tuikuan == true)
- {
- return;
- }
- pMenu->ShowWindow(false);
- CTuikuanWnd* pTuikuanWnd = new CTuikuanWnd;
- if (pTuikuanWnd != NULL)
- {
- pTuikuanWnd->setValueWnd(this);
- pTuikuanWnd->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
- pTuikuanWnd->SetIcon(IDI_ICON_DUILIB);
- pTuikuanWnd->CenterWindow();
- m_is_show_tuikuan = true;
- m_tuikuanWnd = pTuikuanWnd;
- //只要金额不为0,就初始化
- std::string utf8_watch_value = CLewaimaiString::UnicodeToUTF8(m_watchValue);
- if (false)
- {
- std::string format_string = CLewaimaiString::DoubleToString(atof(utf8_watch_value.c_str()), 2);
- m_watchValue = CLewaimaiString::UTF8ToUnicode(format_string);
- pTuikuanWnd->InitMoney(m_watchValue);
- }
- pTuikuanWnd->ShowWindow();
- }
- }
- void CValueWnd::CloseTuikuan()
- {
- m_is_show_tuikuan = false;
- m_tuikuanWnd->Close();
- m_tuikuanWnd = NULL;
- }
- void CValueWnd::AddTrayIcon()
- {
- memset(&m_trayIcon, 0, sizeof(NOTIFYICONDATA));
- m_trayIcon.cbSize = sizeof(NOTIFYICONDATA);
- m_trayIcon.hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON_DUILIB));
- m_trayIcon.hWnd = m_hWnd;
- lstrcpy(m_trayIcon.szTip, _T("智铺子收银插件"));
- m_trayIcon.uCallbackMessage = WM_SHOWTASK;
- m_trayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
- Shell_NotifyIcon(NIM_ADD, &m_trayIcon);
- }
- LRESULT CValueWnd::OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- //如果在图标中单击左键则还原
- if(lParam == WM_LBUTTONDOWN)
- {
- ShowTrayMenu();
- }
- //如果在图标中单击右键则弹出声明式菜单
- else if(lParam == WM_RBUTTONDOWN)
- {
- ShowTrayMenu();
- }
- bHandled = true;
- return 0;
- }
- LRESULT CValueWnd::OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- UINT fuModifiers = (UINT)LOWORD(lParam);
- UINT uVirtKey = (UINT)HIWORD(lParam);
- //判断响应了什么热键
- if (wParam == WM_MYHOTKEY_SHOUKUAN)
- {
- if (m_is_show_setting == false)
- {
- ShowShoukuan();
- }
- }
- bHandled = TRUE;
- return 0;
- }
- void CValueWnd::ShowSystemSetting()
- {
- //先隐藏目录
- pMenu->ShowWindow(false);
- //然后判断和显示系统设置
- if (m_is_show_setting == true)
- {
- return;
- }
- CSystemSettingWnd* pSystemSettingFrame = new CSystemSettingWnd(this);
- m_settingWnd = pSystemSettingFrame;
- if (pSystemSettingFrame != NULL)
- {
- m_is_show_setting = true;
- pSystemSettingFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
- pSystemSettingFrame->SetIcon(IDI_ICON_DUILIB);
- pSystemSettingFrame->CenterWindow();
- pSystemSettingFrame->ShowWindow(true);
- }
- }
- void CValueWnd::CloseSystemSetting()
- {
- m_is_show_setting = false;
- m_settingWnd->Close();
- m_settingWnd = NULL;
- }
- void CValueWnd::ShowJiaoyijilu()
- {
- //先隐藏目录
- pMenu->ShowWindow(false);
- //然后判断和显示系统设置
- if (m_is_show_jiaoyijilu == true)
- {
- return;
- }
- CJiaoyijiluWnd* pJiaoyijiluFrame = new CJiaoyijiluWnd(this);
- m_jiaoyijiluWnd = pJiaoyijiluFrame;
- if (pJiaoyijiluFrame != NULL)
- {
- m_is_show_jiaoyijilu = true;
- pJiaoyijiluFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
- pJiaoyijiluFrame->SetIcon(IDI_ICON_DUILIB);
- pJiaoyijiluFrame->CenterWindow();
- pJiaoyijiluFrame->ShowWindow(true);
- }
- }
- void CValueWnd::CloseJiaoyijilu()
- {
- m_is_show_jiaoyijilu = false;
- m_jiaoyijiluWnd->Close();
- m_jiaoyijiluWnd = NULL;
- }
- void CValueWnd::ShowJiaoyihuizong()
- {
- //先隐藏目录
- pMenu->ShowWindow(false);
- //然后判断和显示系统设置
- if (m_is_show_jiaoyihuizong == true)
- {
- return;
- }
- CJiaoyihuizongWnd* pjiaoyihuizongFrame = new CJiaoyihuizongWnd(this);
- m_jiaoyihuizongWnd = pjiaoyihuizongFrame;
- if (pjiaoyihuizongFrame != NULL)
- {
- m_is_show_jiaoyihuizong = true;
- pjiaoyihuizongFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
- pjiaoyihuizongFrame->SetIcon(IDI_ICON_DUILIB);
- pjiaoyihuizongFrame->CenterWindow();
- UINT ret = pjiaoyihuizongFrame->ShowModal();
- m_is_show_jiaoyihuizong = false;
- if (ret == IDOK)
- {
- }
- else if (ret == IDCANCEL)
- {
- }
- }
- }
- void CValueWnd::ShowJiaoban()
- {
- //先隐藏目录
- pMenu->ShowWindow(false);
- //然后判断和显示系统设置
- if (m_is_show_jiaoban == true)
- {
- return;
- }
- CJiaobanWnd* pjiaobanFrame = new CJiaobanWnd(this);
- m_jiaobanWnd = pjiaobanFrame;
- if (pjiaobanFrame != NULL)
- {
- m_is_show_jiaoban = true;
- pjiaobanFrame->setValueWnd(this);
- pjiaobanFrame->Create(NULL, _T(""), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW);
- pjiaobanFrame->SetIcon(IDI_ICON_DUILIB);
- pjiaobanFrame->CenterWindow();
- UINT ret = pjiaobanFrame->ShowModal();
- m_is_show_jiaoban = false;
- if (ret == IDOK)
- {
- }
- else if (ret == IDCANCEL)
- {
- }
- }
- }
- void CValueWnd::Logout()
- {
- //先正常关闭设置窗口
- m_is_show_setting = false;
- m_settingWnd->Close();
- m_settingWnd = NULL;
- //先做一些清理工作
- m_is_quit = true;
- //取消注册的快捷键
- UnregisterHotKey(m_hWnd, WM_MYHOTKEY_SHOUKUAN);
- //删除右下角的托盘
- Shell_NotifyIcon(NIM_DELETE, &m_trayIcon);
- //注意这里不能delete,这个对象会delete自己
- m_push->Stop();
- pMenu->Close();
- pDingweiWnd->Close();
- pDingweiInfoWnd->Close();
- pOcrWnd->Close();
- //注销Hook
- UninstallHook();
- //暂停数据监控
- StopWatch();
- this->Close();
- //退出登录,取消自动登录
- CSetting::SetParam("setting_is_auto_login", "0", true);
- //创建登录窗口
- CLoginWnd* pLogin = new CLoginWnd();
- if (pLogin == NULL)
- {
- return;
- }
- pLogin->Create(NULL, _T("智铺子收银插件登录"), UI_WNDSTYLE_DIALOG, WS_EX_TOOLWINDOW, 0, 0, 0, 0, NULL);
- pLogin->SetIcon(IDI_ICON_DUILIB);
- pLogin->CenterWindow();
- pLogin->ShowWindow(true);
- }
- void CValueWnd::QuitApp()
- {
- //先做一些清理工作
- m_is_quit = true;
- //取消注册的快捷键
- UnregisterHotKey(m_hWnd, WM_MYHOTKEY_SHOUKUAN);
- //删除右下角的托盘
- Shell_NotifyIcon(NIM_DELETE, &m_trayIcon);
- //注意这里不能delete,这个对象会delete自己
- m_push->Stop();
- pMenu->Close();
- pDingweiWnd->Close();
- pDingweiInfoWnd->Close();
- pOcrWnd->Close();
- //注销Hook
- UninstallHook();
- //暂停数据监控
- StopWatch();
- this->Close();
- //直接退出整个程序
- PostQuitMessage(0);
- }
- void CValueWnd::UpdateKexian(const char* data, int length)
- {
- std::string new_data = data;
- //清屏命令
- std::string clear_command = "\f";
- //4个信号灯全灭
- std::string quanmie_command = "\x1bs0";
- //初始化命令
- std::string init_command = "\x1b\x40";
- //实际读取金额用到的命令
- std::string show_command = "\x1bQA";
- std::string show_command_2 = "QA";
- std::string type_command = "\x1bs";
- if(new_data == clear_command || new_data == quanmie_command || new_data == init_command)
- {
- //清屏命令,或者是熄灭灯的命令
- return;
- }
- int nShowType;
- if(new_data.find(show_command) == new_data.npos)
- {
- //没有\x1bQA,继续找有没有QA(比如思迅)
- if (new_data.find(show_command_2) == new_data.npos)
- {
- //完全没QA
- return;
- }
- else
- {
- nShowType = 2;
- }
- }
- else
- {
- nShowType = 1;
- }
- std::string money;
- int nPos;
-
- if (nShowType == 1)
- {
- nPos = new_data.find(show_command);;
- }
- else
- {
- nPos = new_data.find(show_command_2);
- }
- int nTypePos = new_data.find(type_command, nPos + 1);
- if(nTypePos == new_data.npos)
- {
- //没有类型信息,有些收银机(比如思迅天店)就是不传类型信息,这种只有传什么显示什么了
- int nTabPos = new_data.find("\r", nPos + 1);
- if(nTabPos == new_data.npos)
- {
- //制表符也没有
- return;
- }
- if (nShowType == 1)
- {
- money = new_data.substr(nPos + 3, nTabPos - nPos - 3);
- }
- else
- {
- money = new_data.substr(nPos + 2, nTabPos - nPos - 2);
- }
- CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
- std::string money_show = CLewaimaiString::DoubleToString(atof(money.c_str()), 2);
- m_watchValue = CLewaimaiString::UTF8ToUnicode(money_show);
- valueLabel->SetText(CLewaimaiString::UTF8ToUnicode(money_show).c_str());
- }
- else
- {
- std::string value_type = new_data.substr(nTypePos + 2, 1);
- money = new_data.substr(nPos + 3, nTypePos - nPos - 3 - 1);
- if(value_type == "2")
- {
- //这个表示是总计的,那么就要刷新金额显示
- CLabelUI* valueLabel = static_cast<CLabelUI*>(m_pm.FindControl(_T("value")));
- std::string money_show = CLewaimaiString::DoubleToString(atof(money.c_str()), 2);
- m_watchValue = CLewaimaiString::UTF8ToUnicode(money_show);
- valueLabel->SetText(CLewaimaiString::UTF8ToUnicode(money_show).c_str());
- }
- else
- {
- //这种情况传输的是一些找零、单价之类的信息,不更新客显金额
- }
- }
- return;
- }
- void CValueWnd::InitWndPos()
- {
- ASSERT(::IsWindow(m_hWnd));
- ASSERT((GetWindowStyle(m_hWnd)&WS_CHILD) == 0);
- RECT rcDlg = { 0 };
- ::GetWindowRect(m_hWnd, &rcDlg);
- int DlgWidth = rcDlg.right - rcDlg.left;
- int DlgHeight = rcDlg.bottom - rcDlg.top;
- RECT rcArea = { 0 };
- ::GetWindowRect(::GetDesktopWindow(), &rcArea);
- int xLeft = rcArea.right - DlgWidth - 60;
- int yTop = 100;
- if(xLeft < rcArea.left)
- {
- xLeft = rcArea.left;
- }
- else if(xLeft + DlgWidth > rcArea.right)
- {
- xLeft = rcArea.right - DlgWidth;
- }
- if(yTop < rcArea.top)
- {
- yTop = rcArea.top;
- }
- else if(yTop + DlgHeight > rcArea.bottom)
- {
- yTop = rcArea.bottom - DlgHeight;
- }
- ::SetWindowPos(m_hWnd, HWND_TOPMOST, xLeft, yTop, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
- }
- void CValueWnd::ShowTrayMenu()
- {
- //获取鼠标坐标
- POINT pt;
- GetCursorPos(&pt);
- CRect rect;
- GetWindowRect(pMenu->GetHWND(), &rect);
- int height = rect.bottom - rect.top;
- //显示目录
- ::SetWindowPos(pMenu->GetHWND(), HWND_NOTOPMOST, pt.x, pt.y - 15 - height, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
- pMenu->ShowWindow(true);
- SetFocus(pMenu->GetHWND());
- //右击后点别地可以清除“右击出来的菜单”
- SetForegroundWindow(pMenu->GetHWND());
- }
- void CValueWnd::StartDingweiWnd()
- {
- m_settingWnd->ShowWindow(false);
- m_is_dingwei_wnd = true;
- std::thread(&CValueWnd::StartDingweiWork, this).detach();
- }
- void CValueWnd::ConfirmDingweiWnd(std::wstring value, HWND hWnd)
- {
- m_is_dingwei_wnd = false;
- m_settingWnd->SetDingweiWnd(value, hWnd);
- }
- void CValueWnd::CancalDingweiWnd()
- {
- m_is_dingwei_wnd = false;
- }
- void CValueWnd::StartDingweiWork()
- {
- while (m_is_dingwei_wnd)
- {
- //这个时候,是开始定位窗口了
- POINT pt;
- GetCursorPos(&pt);
- //将屏幕坐标保存起来
- POINT ptScreen = pt;
- //转换成桌面坐标
- HWND hDeskHandle = GetDesktopWindow();
- ScreenToClient(hDeskHandle, &pt);
- HWND hParent = hDeskHandle;
- HWND hChild = ChildWindowFromPointEx(hParent, pt, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT | CWP_SKIPDISABLED);
- if (hChild == pDingweiInfoWnd->GetHWND())
- {
- //这里表示是移动信息窗口了,这里就不要执行后面的刷新操作了
- }
- else
- {
- while (hChild != NULL && hChild != hParent)
- {
- //说明还有更下级的子窗口
- hParent = hChild;
- pt = ptScreen;
- ScreenToClient(hParent, &pt);
- hChild = ChildWindowFromPointEx(hParent, pt, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT);
- }
- HWND hWnd = hParent;
- RECT rect;
- GetWindowRect(hWnd, &rect);
- //在这个窗口上,画一个边框
- pDingweiWnd->ShowWindow(true);
- ::SetWindowPos(pDingweiWnd->GetHWND(), HWND_TOPMOST, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOACTIVATE);
- //显示定位信息
- TCHAR szTitle[MAX_PATH] = { 0 };
- LPWSTR lpWindowName = szTitle;
- ::SendMessageW(hWnd, WM_GETTEXT, (WPARAM)(MAX_PATH), (LPARAM)lpWindowName);
- //设置信息窗口的内容
- pDingweiInfoWnd->UpdateInfo(lpWindowName, hWnd);
- pDingweiInfoWnd->ShowWindow(true);
- int nWidth = rect.right - rect.left;
- if (nWidth < 380)
- {
- nWidth = 380;
- }
- ::SetWindowPos(pDingweiInfoWnd->GetHWND(), HWND_TOPMOST, rect.left, rect.bottom, nWidth, 36, SWP_NOACTIVATE);
- }
- Sleep(100);
- }
- m_settingWnd->ShowWindow(true);
- pDingweiWnd->ShowWindow(false);
- pDingweiInfoWnd->ShowWindow(false);
- }
- void CValueWnd::StartOcrWnd()
- {
- m_settingWnd->ShowWindow(false);
- m_is_orc_wnd = true;
- pOcrWnd->ShowWindow(true);
- //先默认居中
- ::SetWindowPos(pOcrWnd->GetHWND(), HWND_TOPMOST, 0, 0, 320, 80, SWP_NOMOVE | SWP_NOACTIVATE);
- pOcrWnd->CenterWindow();
- }
- void CValueWnd::ConfirmOcrWnd(RECT rect)
- {
- m_is_orc_wnd = false;
- pOcrWnd->ShowWindow(false);
- //保存截屏的结果
- m_settingWnd->SetOcrWnd(rect);
- //显示设置窗口
- m_settingWnd->ShowWindow(true);
- }
- void CValueWnd::CancelOcr()
- {
- m_is_orc_wnd = false;
- pOcrWnd->ShowWindow(false);
- //显示设置窗口
- m_settingWnd->ShowWindow(true);
- }
- tesseract::TessBaseAPI& CValueWnd::GetTess()
- {
- return m_tess;
- }
- bool CValueWnd::UpdateRegisterHotKey()
- {
- UINT shoukuan_mod = (UINT)atoi(CSetting::GetParam("system_setting_kuaijiejian_shoukuan_mod").c_str());
- UINT shoukuan_vk = (UINT)atoi(CSetting::GetParam("system_setting_kuaijiejian_shoukuan_vk").c_str());
- //先卸载旧的,再注册新的
- UnregisterHotKey(m_hWnd, WM_MYHOTKEY_SHOUKUAN);
- int nRet = RegisterHotKey(m_hWnd, WM_MYHOTKEY_SHOUKUAN, shoukuan_mod, shoukuan_vk);
- return nRet;
- }
- //全局监听键盘输入
- void CValueWnd::RegKeyboardRawInput()
- {
- RAWINPUTDEVICE rawInputDevice[1];
- rawInputDevice[0].usUsagePage = 0x01;//设备类
- rawInputDevice[0].usUsage = 0x06;//设备类内的具体设备
- rawInputDevice[0].dwFlags = RIDEV_INPUTSINK;//意味着即使窗口失去焦点位置,仍然会一直接收输入消息
- rawInputDevice[0].hwndTarget = m_hWnd;
- if (RegisterRawInputDevices(rawInputDevice, 1, sizeof(rawInputDevice[0])) == FALSE)
- {
- printf("RegisterRawInputDevices failed");
- }
- }
- void CValueWnd::PrintTest()
- {
- m_push->AddPrinter("", 3);
- }
- void CValueWnd::PrintZhifu(std::string out_trade_no)
- {
- m_push->AddPrinter(out_trade_no, 1);
- }
- void CValueWnd::PrintTuikuan(std::string out_trade_no)
- {
- m_push->AddPrinter(out_trade_no, 2);
- }
- void CValueWnd::PrintJiaoban(CJiaobanMessage& message)
- {
- m_push->AddPrinter(message);
- }
|