Explorar el Código

修复抓取字符的bug

zhangyang hace 4 años
padre
commit
44bc453e16
Se han modificado 1 ficheros con 41 adiciones y 30 borrados
  1. 41 30
      zhipuzi_pos_windows/wnd/CMainWnd.cpp

+ 41 - 30
zhipuzi_pos_windows/wnd/CMainWnd.cpp

@@ -699,27 +699,29 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 			//通过虚拟键盘码得到名字
 			//通过虚拟键盘码得到名字
 			ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
 			ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
 
 
-			//LOG_INFO("vkey:" << raw->data.keyboard.VKey);
+			LOG_INFO("vkey:" << raw->data.keyboard.VKey<<", keytext:"<<keytext);
+
 			if (raw->data.keyboard.VKey >= 48 && raw->data.keyboard.VKey <= 122)
 			if (raw->data.keyboard.VKey >= 48 && raw->data.keyboard.VKey <= 122)
 			{
 			{
+				char keytext[10] = { 0 };
+				BYTE state[256] = { 0 };
+
+				//通过虚拟键盘码得到名字
+				ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
+
 				//这里是数字和英文字母之间的字符,包含部分标点
 				//这里是数字和英文字母之间的字符,包含部分标点
 				if (m_is_start_catch == false)
 				if (m_is_start_catch == false)
 				{
 				{
+					//第一次点击,还无法判定是人工还是机器输入的,先保存下来
 					m_is_start_catch = true;
 					m_is_start_catch = true;
 
 
 					m_catch_string = "";
 					m_catch_string = "";
 
 
-					m_is_next_daxie = false;
-
-					char keytext[10] = { 0 };
-					BYTE state[256] = { 0 };
-
-					//通过虚拟键盘码得到名字
-					ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
+					m_is_next_daxie = false;					
 
 
 					m_catch_string += string(keytext);
 					m_catch_string += string(keytext);
 
 
-					//LOG_INFO("起始字符:" << keytext << ",累积:" << m_catch_string.c_str());
+					LOG_INFO("起始字符:" << keytext << ",累积:" << m_catch_string.c_str());
 
 
 					m_last_catch_clock = clock();
 					m_last_catch_clock = clock();
 				}
 				}
@@ -731,22 +733,23 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 					double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
 					double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
 					if (total_t > 0.05)
 					if (total_t > 0.05)
 					{
 					{
-						//LOG_INFO("人工输入");
-						//如果超过了50ms,说明是人工输入的了,就重置所有状态
-						m_is_start_catch = false;
+						LOG_INFO("发现人工输入");
 
 
+						//如果超过了50ms,说明是前面一个字符是人工输入的了,不能代表现在这个字符是人工输入的,把之前的字符清空,但是目前的这个字符还是要保存
 						m_catch_string = "";
 						m_catch_string = "";
 
 
 						m_is_next_daxie = false;
 						m_is_next_daxie = false;
+
+						//把当前字符保存下来
+						m_catch_string += string(keytext);
+
+						LOG_INFO("起始字符:" << keytext << ",累积:" << m_catch_string.c_str());
+
+						m_last_catch_clock = clock();
 					}
 					}
 					else
 					else
 					{
 					{
-						char keytext[10] = { 0 };
-						BYTE state[256] = { 0 };
-
-						//通过虚拟键盘码得到名字
-						ToAscii(raw->data.keyboard.VKey, raw->data.keyboard.MakeCode, state, (LPWORD)keytext, 0);
-
+						//这种说明前一个和当前的字符,都是机器输入的,都保存下来
 						std::string s_keytext = keytext;
 						std::string s_keytext = keytext;
 						if (m_is_next_daxie == true)
 						if (m_is_next_daxie == true)
 						{
 						{
@@ -759,7 +762,7 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 
 
 						m_catch_string += s_keytext;
 						m_catch_string += s_keytext;
 
 
-						//LOG_INFO("抓取字符:" << s_keytext.c_str() << ",累积:" << m_catch_string.c_str());
+						LOG_INFO("抓取字符:" << s_keytext.c_str() << ",累积:" << m_catch_string.c_str());
 
 
 						m_last_catch_clock = clock();
 						m_last_catch_clock = clock();
 					}
 					}
@@ -777,16 +780,18 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 					double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
 					double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
 					if (total_t > 0.05)
 					if (total_t > 0.05)
 					{
 					{
-						//LOG_INFO("抓取enter人工");
-						//如果超过了50ms,说明是人工输入的了,就重置所有状态
+						LOG_INFO("抓取enter人工");
+
+						//如果超过了50ms,说明前面一个字符是人工输入的,那么相当于这次直接输入了一个enter,也没意义
 						m_is_start_catch = false;
 						m_is_start_catch = false;
 						m_catch_string = "";
 						m_catch_string = "";
 						m_is_next_daxie = false;
 						m_is_next_daxie = false;
 					}
 					}
 					else
 					else
 					{
 					{
-						//LOG_INFO("抓取enter结束");
-						//这种说明是扫码的
+						LOG_INFO("抓取enter结束");
+
+						//这种说明前一个字符和当前字符都是机器输入的,可以判定输入结束
 						std::string last = m_catch_string;
 						std::string last = m_catch_string;
 
 
 						//对抓取结果,进行处理
 						//对抓取结果,进行处理
@@ -800,6 +805,7 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 				}
 				}
 				else
 				else
 				{
 				{
+					//还没开始抓取就输入了enter,没有意义,重新开始
 					m_is_start_catch = false;
 					m_is_start_catch = false;
 					m_catch_string = "";
 					m_catch_string = "";
 					m_is_next_daxie = false;
 					m_is_next_daxie = false;
@@ -810,7 +816,8 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 				//这个是大小写切换的按键,扫描大写字母的时候会用到,每个大写字母都是由2个组成,先来个16,再来个对应小写字母的asicc
 				//这个是大小写切换的按键,扫描大写字母的时候会用到,每个大写字母都是由2个组成,先来个16,再来个对应小写字母的asicc
 				if (m_is_start_catch == false)
 				if (m_is_start_catch == false)
 				{
 				{
-					//说明第一个字符就是大写字母
+					LOG_INFO("抓取第1个16");
+					//说明第一个字符就是大写字母,暂时还无法判断是机器还是人工输入的,先开启抓取
 					m_is_start_catch = true;
 					m_is_start_catch = true;
 
 
 					m_catch_string = "";
 					m_catch_string = "";
@@ -827,14 +834,18 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 					double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
 					double total_t = (double)(now - m_last_catch_clock) / CLOCKS_PER_SEC;
 					if (total_t > 0.05)
 					if (total_t > 0.05)
 					{
 					{
-						//LOG_INFO("抓取16人工");
-						//如果超过了50ms,说明是人工输入的了,就重置所有状态
-						m_is_start_catch = false;
+						LOG_INFO("抓取16人工");
+						//如果超过了50ms,只能说明之前的字符是人工输入的,不能代表目前的字符是人工输入的,把之前的清空
+
 						m_catch_string = "";
 						m_catch_string = "";
-						m_is_next_daxie = false;
+						m_is_next_daxie = true;
+
+						m_last_catch_clock = clock();
 					}
 					}
 					else
 					else
 					{
 					{
+						LOG_INFO("抓取16");
+						//这个说明之前的和当前的都是机器输入的
 						m_is_next_daxie = true;
 						m_is_next_daxie = true;
 
 
 						m_last_catch_clock = clock();
 						m_last_catch_clock = clock();
@@ -843,8 +854,8 @@ LRESULT CMainWnd::OnInput(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle
 			}
 			}
 			else
 			else
 			{
 			{
-				//LOG_INFO("抓取结束,重新开始");
-				//这种直接忽略,重新开始
+				LOG_INFO("抓取结束,重新开始");
+				//输入了无意义的字符,这种直接忽略,重新开始
 				m_is_start_catch = false;
 				m_is_start_catch = false;
 
 
 				m_catch_string = "";
 				m_catch_string = "";