فهرست منبع

暂时提交一下,触摸键盘输入的问题继续跟踪

张洋 3 هفته پیش
والد
کامیت
41500d96bf

+ 1 - 0
.gitignore

@@ -12,3 +12,4 @@ zhipuzi_pos_windows.pdb
 /bin/Win32/Debug/zhipuzi_pos_windows/DuiLib_d.pdb
 /bin/Win32/Debug/zhipuzi_pos_windows/DuiLib_d.pdb
 /.workbuddy
 /.workbuddy
 /DuiLib/temp
 /DuiLib/temp
+/zhipuzi_pos_windows/temp

+ 245 - 3
DuiLib/Control/UIEdit.cpp

@@ -1,8 +1,49 @@
 #include "StdAfx.h"
 #include "StdAfx.h"
 #include "UIEdit.h"
 #include "UIEdit.h"
+#include "../Utils/UIDiag.h"
 
 
 namespace DuiLib
 namespace DuiLib
 {
 {
+	// ==================================================================
+	// 【诊断 · 新建商品弹框「输入文字消失」(Win10 触摸键盘)】
+	//
+	// 现象:手指点触摸键盘输入,已输入的字(尤其中文输入的组合串)会消失;
+	//       鼠标点同一个键盘则完全正常。
+	//
+	// 已确认的代码事实(不用日志就能确定的):
+	//   · 文本**真实存放**在 CEditWnd —— 一个原生的 EDIT 子窗口里(WS_CHILD),
+	//     DuiLib 只通过 EN_CHANGE 把内容同步回 CEditUI::m_sText;
+	//   · 该窗口的生命周期**极短**:只要它失去键盘焦点,
+	//     CEditWnd::OnKillFocus 就会 PostMessage(WM_CLOSE) **把它销毁**;
+	//   · 所以"谁在这一刻抢走了焦点"就是本问题的全部答案。
+	//     一旦焦点离开 EDIT,输入法正在拼的字会被撤销(中文尤其明显),
+	//     之后到达的字符也无处可去 —— 用户看到的就是"输入完被自动删除"。
+	//
+	// 因此下面这几个 helper 只做一件事:把"抢焦点的是谁"记清楚。
+	// 判读要点:
+	//   · 若 EDIT-KILLFOCUS 的 newTid != selfTid ⇒ 焦点被**别的进程/线程**抢走
+	//     (触摸键盘 TabTip / TextInputHost 是首要嫌疑);
+	//   · newClass 是 "#32770" ⇒ 被我们自己的弹框拿走了;
+	//   · 若同一个 owner 出现 INIT → FIN → INIT 的抖动 ⇒ 窗口在反复重建,
+	//     重建时用的是 m_sText(可能落后于 IME 的组合状态)⇒ 字就"没了"。
+	// ==================================================================
+	static LPCTSTR DiagWndClass(HWND h)
+	{
+		static TCHAR s_cls[128];
+		s_cls[0] = _T('\0');
+		if (h != NULL && ::IsWindow(h)) ::GetClassName(h, s_cls, _countof(s_cls));
+		return s_cls;
+	}
+
+	static DWORD DiagWndTid(HWND h)
+	{
+		DWORD dwTid = 0;
+		if (h != NULL && ::IsWindow(h)) dwTid = ::GetWindowThreadProcessId(h, NULL);
+		return dwTid;
+	}
+
+	// 调 CPaintManagerUI 的"最近一次输入是不是触摸"的判据(见 UIManager.h)。
+	// 只用于日志标注,不参与任何判断。
 	class CEditWnd : public CWindowWnd
 	class CEditWnd : public CWindowWnd
 	{
 	{
 	public:
 	public:
@@ -17,6 +58,7 @@ namespace DuiLib
 
 
 		LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
 		LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
 		LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 		LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
+		LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 		LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 		LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 
 
 	protected:
 	protected:
@@ -38,6 +80,15 @@ namespace DuiLib
 	void CEditWnd::Init(CEditUI* pOwner)
 	void CEditWnd::Init(CEditUI* pOwner)
 	{
 	{
 		m_pOwner = pOwner;
 		m_pOwner = pOwner;
+		{
+			CDuiString sOwnerName = pOwner->GetName();
+			LPCTSTR pszOwnerText = pOwner->GetText();
+			DuiLibDiag::Log(_T("EDIT-INIT enter owner=%s focused=%d ownerHwnd(old)=%p text='%s' nFocus=%p focusClass=%s focusTid=%u selfTid=%u"),
+				sOwnerName.GetData(), (int)(pOwner->IsFocused() ? 1 : 0), (void*)pOwner->GetHWND(),
+				pszOwnerText != NULL ? pszOwnerText : _T(""),
+				(void*)::GetFocus(), DiagWndClass(::GetFocus()), (unsigned)DiagWndTid(::GetFocus()),
+				(unsigned)::GetCurrentThreadId());
+		}
 		RECT rcPos = CalPos();
 		RECT rcPos = CalPos();
 		UINT uStyle = 0;
 		UINT uStyle = 0;
 		if(m_pOwner->GetManager()->IsLayered()) {
 		if(m_pOwner->GetManager()->IsLayered()) {
@@ -92,6 +143,18 @@ namespace DuiLib
 		}
 		}
 
 
 		m_bInit = true;
 		m_bInit = true;
+		{
+			CDuiString sOwnerName = m_pOwner->GetName();
+			// nFocus 应当就是本窗口;若不等,说明有更晚的 SetFocus 把它抢走了。
+			// sel=[start,end] 是设给 EDIT 的光标/选择范围:
+			//   路 B(正常点击)是 [点击处, 点击处];路 A(已聚焦但窗口被销毁后重建)是 [0, 全文] ⇒ 全选。
+			DWORD dwSelStart = 0, dwSelEnd = 0;
+			::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&dwSelStart, (LPARAM)&dwSelEnd);
+			DuiLibDiag::Log(_T("EDIT-INIT done  owner=%s hwnd=%p nFocus=%p focusIsSelf=%d sel=[%u,%u] text='%s'"),
+				sOwnerName.GetData(), (void*)m_hWnd, (void*)::GetFocus(),
+				(int)(::GetFocus() == m_hWnd ? 1 : 0),
+				(unsigned)LOWORD(dwSelStart), (unsigned)LOWORD(dwSelEnd), m_pOwner->GetText());
+		}
 	}
 	}
 
 
 	RECT CEditWnd::CalPos()
 	RECT CEditWnd::CalPos()
@@ -137,6 +200,15 @@ namespace DuiLib
 
 
 	void CEditWnd::OnFinalMessage(HWND hWnd)
 	void CEditWnd::OnFinalMessage(HWND hWnd)
 	{
 	{
+		{
+			CDuiString sOwnerName = (m_pOwner != NULL) ? m_pOwner->GetName() : CDuiString(_T("?"));
+			LPCTSTR pszText = (m_pOwner != NULL) ? m_pOwner->GetText() : (LPCTSTR)NULL;
+			// 同一个 owner 反复出现 FIN → INIT ⇒ 窗口在抖动重建;
+			// 重建走的是 m_sText,而 m_sText 可能落后于 IME 尚未提交的组合串 ⇒ 字"没了"。
+			DuiLibDiag::Log(_T("EDIT-FIN hwnd=%p owner=%s text='%s' nFocus=%p"),
+				(void*)hWnd, sOwnerName.GetData(), pszText != NULL ? pszText : _T(""),
+				(void*)::GetFocus());
+		}
 		m_pOwner->Invalidate();
 		m_pOwner->Invalidate();
 		// Clear reference and die
 		// Clear reference and die
 		if( m_hBkBrush != NULL ) ::DeleteObject(m_hBkBrush);
 		if( m_hBkBrush != NULL ) ::DeleteObject(m_hBkBrush);
@@ -155,6 +227,7 @@ namespace DuiLib
 			bHandled = FALSE;
 			bHandled = FALSE;
 		}
 		}
 		else if( uMsg == WM_KILLFOCUS ) lRes = OnKillFocus(uMsg, wParam, lParam, bHandled);
 		else if( uMsg == WM_KILLFOCUS ) lRes = OnKillFocus(uMsg, wParam, lParam, bHandled);
+		else if( uMsg == WM_CLOSE ) lRes = OnClose(uMsg, wParam, lParam, bHandled);
 		else if( uMsg == OCM_COMMAND ) {
 		else if( uMsg == OCM_COMMAND ) {
 			if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE ) lRes = OnEditChanged(uMsg, wParam, lParam, bHandled);
 			if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE ) lRes = OnEditChanged(uMsg, wParam, lParam, bHandled);
 			else if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE ) {
 			else if( GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE ) {
@@ -215,10 +288,91 @@ namespace DuiLib
 	LRESULT CEditWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 	LRESULT CEditWnd::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
 	{
 	{
 		LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
 		LRESULT lRes = ::DefWindowProc(m_hWnd, uMsg, wParam, lParam);
+		{
+			CDuiString sOwnerName = (m_pOwner != NULL) ? m_pOwner->GetName() : CDuiString(_T("?"));
+			HWND hNewFocus = ::GetFocus();
+			const DWORD dwSelfTid = ::GetCurrentThreadId();
+			const DWORD dwNewTid = DiagWndTid(hNewFocus);
+			// ★ 这条就是"输入法正在拼的字会不会消失"的现场。
+			//   失焦本身不致命 —— 致命的是"失焦即销毁"叠加"瞬态失焦"(见 OnClose)。
+			//   判读:
+			//     · newFocus = 00000000 ⇒ 本线程此刻**没有**焦点窗口。
+			//       真实成因只有两种:整个窗口失活(触摸键盘抢前台时的典型形态),
+			//       或者焦点正在搬家途中。此时 sameProc 无意义(下面记成 -1,
+			//       别再把它读成"被别的进程抢走"——NULL 没有进程可言)。
+			//     · newFocus != NULL 且 sameProc=0 ⇒ 真被**别的进程/线程**抢走;
+			//     · newClass = EditWnd ⇒ 我们自己的另一个输入框接走了焦点(正常切框);
+			//     · newClass = #32770 ⇒ 被本线程的弹框本体拿走(窗口内部搬家)。
+			DuiLibDiag::Log(_T("EDIT-KILLFOCUS hwnd=%p owner=%s newFocus=%p newClass=%s newTid=%u selfTid=%u sameProc=%d -> 投递 WM_CLOSE(去留由 OnClose 复核)"),
+				(void*)m_hWnd, sOwnerName.GetData(), (void*)hNewFocus, DiagWndClass(hNewFocus),
+				(unsigned)dwNewTid, (unsigned)dwSelfTid,
+				(int)(hNewFocus == NULL ? -1 : ((dwNewTid == dwSelfTid) ? 1 : 0)));
+		}
 		PostMessage(WM_CLOSE);
 		PostMessage(WM_CLOSE);
 		return lRes;
 		return lRes;
 	}
 	}
 
 
+	// ★ 修复(2026-09-23 · 「手指点触摸键盘输入不进去」)
+	//
+	// 背景(真机日志实证,一次"手指点输入框"就够看清楚):
+	//
+	//   PTR-DOWN stealFocus      ::SetFocus(m_hWndPaint)        ← UIManager.cpp 抢走键盘焦点
+	//   EDIT-KILLFOCUS           PostMessage(WM_CLOSE)          ← 销毁请求**排队**(异步)
+	//   EDITUI-SETFOCUS 复用编辑窗  ::SetFocus(hEdit)            ← 焦点已经还给 EDIT
+	//   …… 几十毫秒后 ……
+	//   EDIT-FIN                 窗口还是被那条排队的 WM_CLOSE 销毁了
+	//
+	// 也就是说:**焦点刚被抢回来,窗口照旧死掉**。而 CPaintManagerUI::SetFocus 有
+	// `pControl == m_pFocus` 早退,不会再发 UIEVENT_SETFOCUS ⇒ 窗口不再重建。
+	// 触摸键盘敲出的字符、退格、输入法候选词的提交,就全都失去了落点
+	// (真机日志里对应"9.7 秒零条 EDIT-CHANGE")。
+	//
+	// "手指点虚拟键盘"之所以必现、鼠标不犯,是因为手指点它的那一刻本窗口会短暂失活
+	// (WND-ACTIVATE wParam=0(INACTIVE) fg=00000000 + EDIT-KILLFOCUS newFocus=00000000),
+	// 于是又排上一条 WM_CLOSE;鼠标那一路不会走到这里。
+	//
+	// ⇒ 判据(纯状态、零时间戳):**延后到 WM_CLOSE 真正被取出来处理时**,再看一眼
+	//   「我的 owner 现在还是不是 DuiLib 的焦点控件」:
+	//
+	//     · 还是 ⇒ 这次失焦只是**瞬态**(窗口内部焦点搬家 / 本窗口短暂失活),
+	//              owner 还要接着输入 ⇒ 取消销毁,窗口活着等 SETFOCUS 回来;
+	//     · 不是 ⇒ 焦点已被别的控件/别的窗口拿走,或者控件被隐藏/移除、弹框正在销毁
+	//              (那些路径都会先 SetFocus(NULL) 或把 m_pFocus 置 NULL)
+	//              ⇒ 按原设计销毁。
+	//
+	// 为什么必须延后:CPaintManagerUI::SetFocus 的顺序是
+	// 「先 ::SetFocus(画布窗口) 让旧编辑窗失焦 → 再派发 KILLFOCUS → 最后才把 m_pFocus 换成新控件」。
+	// 若在原生 WM_KILLFOCUS 里当场判断,读到的一定还是**旧值** ⇒ 区分不了
+	// "瞬态失焦"和"真的切到另一个控件"。
+	//
+	// 这条判据对"窗口失活"同样成立 —— 而窗口失活恰恰是手指点触摸键盘时唯一会发生的变数。
+	LRESULT CEditWnd::OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
+	{
+		CPaintManagerUI* pManager = (m_pOwner != NULL) ? m_pOwner->GetManager() : NULL;
+		CControlUI* pMgrFocus = (pManager != NULL) ? pManager->GetFocus() : (CControlUI*)NULL;
+		const bool bOwnerKeepsFocus = (pManager != NULL && pMgrFocus == m_pOwner);
+
+		{
+			CDuiString sOwnerName = (m_pOwner != NULL) ? m_pOwner->GetName() : CDuiString(_T("?"));
+			DuiLibDiag::Log(_T("EDIT-CLOSE hwnd=%p owner=%s mgrFocus=%p ownerKeepsFocus=%d -> %s"),
+				(void*)m_hWnd, sOwnerName.GetData(), (void*)pMgrFocus,
+				(int)(bOwnerKeepsFocus ? 1 : 0),
+				bOwnerKeepsFocus ? _T("取消销毁(瞬态失焦,窗口保留)") : _T("销毁"));
+		}
+
+		bHandled = TRUE;
+		if (bOwnerKeepsFocus)
+		{
+			// 不销毁。焦点会由下面两条既有路径送回来,不需要在这里造新机制:
+			//   · 我们自己的 ::SetFocus(m_hWndPaint) → WM_SETFOCUS → 重发 UIEVENT_SETFOCUS
+			//     → CEditUI::DoEvent 的"复用编辑窗"分支 Show+SetFocus;
+			//   · 整个窗口重新被激活 → MessageHandler 的 WM_ACTIVATE 同理。
+			return 0;
+		}
+		::DestroyWindow(m_hWnd);
+		return 0;
+	}
+
 	LRESULT CEditWnd::OnEditChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
 	LRESULT CEditWnd::OnEditChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
 	{
 	{
 		if( !m_bInit ) return 0;
 		if( !m_bInit ) return 0;
@@ -230,6 +384,18 @@ namespace DuiLib
 		if( pstr == NULL ) return 0;
 		if( pstr == NULL ) return 0;
 		::GetWindowText(m_hWnd, pstr, cchLen);
 		::GetWindowText(m_hWnd, pstr, cchLen);
 		m_pOwner->m_sText = pstr;
 		m_pOwner->m_sText = pstr;
+		{
+			CDuiString sOwnerName = m_pOwner->GetName();
+			// 每一次内容变化都留痕 —— "字符进来"与"被清空"都能看到。
+			// 判读:
+			//   · append 之后突然出现 len=0 ⇒ 有代码把它清掉了。可能是业务侧的
+			//     数字过滤(首个字符非法时 SetText("")),也可能是 CEditUI::SetText
+			//     被调用 —— 后者会在 EDITUI-SETTEXT 行留下记录;
+			//   · 只看到 append、从没出现 len=0,用户却说"字没了"
+			//     ⇒ 字符根本没进到这个窗口 ⇒ 焦点已经不在它身上(查 EDIT-KILLFOCUS)。
+			DuiLibDiag::Log(_T("EDIT-CHANGE hwnd=%p owner=%s len=%d text='%s'"),
+				(void*)m_hWnd, sOwnerName.GetData(), cchLen - 1, pstr);
+		}
 		m_pOwner->GetManager()->SendNotify(m_pOwner, DUI_MSGTYPE_TEXTCHANGED);
 		m_pOwner->GetManager()->SendNotify(m_pOwner, DUI_MSGTYPE_TEXTCHANGED);
 		if( m_pOwner->GetManager()->IsLayered() ) m_pOwner->Invalidate();
 		if( m_pOwner->GetManager()->IsLayered() ) m_pOwner->Invalidate();
 		return 0;
 		return 0;
@@ -269,6 +435,32 @@ namespace DuiLib
 
 
 	void CEditUI::DoEvent(TEventUI& event)
 	void CEditUI::DoEvent(TEventUI& event)
 	{
 	{
+		// 【诊断 · 新建商品弹框「输入文字消失」】只对焦点/点击类事件留痕,避免鼠标移动刷屏。
+		//
+		// 为什么这条日志值得存在:本控件后面那个 `if( m_pWindow ) return;` 会让
+		// UIEVENT_SETFOCUS **提前返回**,从而走不到 CLabelUI::DoEvent 里的
+		// `m_bFocused = true` —— 于是 IsFocused() 与真实焦点可能脱节。
+		// 而下面 UIEVENT_BUTTONDOWN 的三岔口正是**用 IsFocused() 分流**的:
+		//   · IsFocused() && m_pWindow == NULL ⇒ 路 A:新建窗口 + **全选整框**
+		//   · m_pWindow != NULL               ⇒ 路 B:光标落到点击处(正常点击)
+		//   · 两者都不满足                    ⇒ 什么都不做(点击被静默丢弃)
+		// m_bFocused / m_pWindow 这两个值必须能在日志里直接看到,否则无从判断走了哪条。
+		if (event.Type == UIEVENT_SETFOCUS
+			|| event.Type == UIEVENT_KILLFOCUS
+			|| event.Type == UIEVENT_BUTTONDOWN
+			|| event.Type == UIEVENT_BUTTONUP
+			|| event.Type == UIEVENT_TOUCHDOWN
+			|| event.Type == UIEVENT_TOUCHUP
+			|| event.Type == UIEVENT_DBLCLICK
+			|| event.Type == UIEVENT_RBUTTONDOWN)
+		{
+			CDuiString sName = GetName();
+			DuiLibDiag::Log(_T("EDITUI-EVENT type=%d owner=%s m_bFocused=%d m_pWindow=%p editHwnd=%p pt=%d,%d nFocus=%p mgrHwnd=%p"),
+				event.Type, sName.GetData(), (int)(m_bFocused ? 1 : 0), (void*)m_pWindow,
+				(void*)GetHWND(), event.ptMouse.x, event.ptMouse.y,
+				(void*)::GetFocus(), (void*)(m_pManager != NULL ? m_pManager->GetPaintWindow() : (HWND)NULL));
+		}
+
 		if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {
 		if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {
 			if( m_pParent != NULL ) m_pParent->DoEvent(event);
 			if( m_pParent != NULL ) m_pParent->DoEvent(event);
 			else CLabelUI::DoEvent(event);
 			else CLabelUI::DoEvent(event);
@@ -290,7 +482,35 @@ namespace DuiLib
 		}
 		}
 		if( event.Type == UIEVENT_SETFOCUS && IsEnabled() ) 
 		if( event.Type == UIEVENT_SETFOCUS && IsEnabled() ) 
 		{
 		{
-			if( m_pWindow ) return;
+			if( m_pWindow != NULL ) 
+			{
+				// ★ 修复(见本文件顶部「输入文字消失」说明)
+				//
+				// 这里是原来的 `if( m_pWindow ) return;`。它有两个后果:
+				//   (1) 走不到 CLabelUI::DoEvent,`m_bFocused = true` 永不执行
+				//       ⇒ IsFocused() 与真实焦点长期脱节(下面 BUTTONDOWN 曾用它分流);
+				//   (2) 编辑窗口**还在**、但键盘焦点已被系统/输入法/触摸键盘挪走时,
+				//       没有任何代码把焦点还回去 —— 而所有按键(含退格)与输入法
+				//       候选词的提交都必须依赖它。这正是"切换过一次输入框后
+				//       连退格都输不进去"的那一格。
+				//
+				// 既然 DuiLib 的焦点此刻仍指向本控件(否则收不到 SETFOCUS),
+				// 就把显示与键盘焦点一并还给它。
+				HWND hEdit = *m_pWindow;
+				if (hEdit != NULL && ::IsWindow(hEdit))
+				{
+					if (!::IsWindowVisible(hEdit)) ::ShowWindow(hEdit, SW_SHOWNOACTIVATE);
+					if (::GetFocus() != hEdit) ::SetFocus(hEdit);
+				}
+				{
+					CDuiString sName = GetName();
+					DuiLibDiag::Log(_T("EDITUI-SETFOCUS 复用编辑窗 owner=%s editHwnd=%p nFocus=%p -> Show+SetFocus"),
+						sName.GetData(), (void*)hEdit, (void*)::GetFocus());
+				}
+				CLabelUI::DoEvent(event);   // 让基类补上 m_bFocused = true
+				Invalidate();
+				return;
+			}
 			m_pWindow = new CEditWnd();
 			m_pWindow = new CEditWnd();
 			ASSERT(m_pWindow);
 			ASSERT(m_pWindow);
 			m_pWindow->Init(this);
 			m_pWindow->Init(this);
@@ -304,8 +524,17 @@ namespace DuiLib
 		{
 		{
 			if( IsEnabled() ) {
 			if( IsEnabled() ) {
 				GetManager()->ReleaseCapture();
 				GetManager()->ReleaseCapture();
-				if( IsFocused() && m_pWindow == NULL )
+				// ★ 修复:判据原来还多要求一个 `IsFocused()`。但那个标志由
+				//   CLabelUI::DoEvent 维护,而上面的 SETFOCUS 分支在"编辑窗已存在"
+				//   时会早退、根本走不到那里 ⇒ IsFocused() 可能长期为假。
+				//   于是"点击一个还没有编辑窗的输入框"时**两条分支都不走**:
+				//   点击被静默丢弃(体感就是"点了没反应")。
+				//   现在只看"有没有编辑窗" —— 点了输入框就一定拿得到输入能力。
+				if( m_pWindow == NULL )
 				{
 				{
+					CDuiString sName = GetName();
+					DuiLibDiag::Log(_T("EDITUI-BUTTONDOWN 无编辑窗 -> 新建并全选 owner=%s m_bFocused=%d"),
+						sName.GetData(), (int)(m_bFocused ? 1 : 0));
 					m_pWindow = new CEditWnd();
 					m_pWindow = new CEditWnd();
 					ASSERT(m_pWindow);
 					ASSERT(m_pWindow);
 					m_pWindow->Init(this);
 					m_pWindow->Init(this);
@@ -317,8 +546,11 @@ namespace DuiLib
 						Edit_SetSel(*m_pWindow, 0, nSize);
 						Edit_SetSel(*m_pWindow, 0, nSize);
 					}
 					}
 				}
 				}
-				else if( m_pWindow != NULL )
+				else
 				{
 				{
+					CDuiString sName = GetName();
+					DuiLibDiag::Log(_T("EDITUI-BUTTONDOWN 有编辑窗 -> 光标落到点击处 owner=%s pt=%d,%d autoSelAll=%d"),
+						sName.GetData(), event.ptMouse.x, event.ptMouse.y, (int)(m_bAutoSelAll ? 1 : 0));
 					if (!m_bAutoSelAll) {
 					if (!m_bAutoSelAll) {
 						RECT rcTextPadding = GetTextPadding();
 						RECT rcTextPadding = GetTextPadding();
 						POINT pt = event.ptMouse;
 						POINT pt = event.ptMouse;
@@ -375,6 +607,16 @@ namespace DuiLib
 
 
 	void CEditUI::SetText(LPCTSTR pstrText)
 	void CEditUI::SetText(LPCTSTR pstrText)
 	{
 	{
+		{
+			CDuiString sName = GetName();
+			// 谁在改文本、改成什么。业务侧的数字过滤在"首个字符非法"时会
+			// SetText("") —— 那会把整框内容清空(正是"输入完被自动删除"的一种表现)。
+			// 注意:本函数无论编辑窗在不在都会执行,m_pWindow=NULL 时只改 m_sText,
+			// 那个新值要等下次 CEditWnd::Init 才会真正写进 EDIT。
+			DuiLibDiag::Log(_T("EDITUI-SETTEXT owner=%s m_pWindow=%p old='%s' new='%s'"),
+				sName.GetData(), (void*)m_pWindow,
+				m_sText.GetData(), pstrText != NULL ? pstrText : _T(""));
+		}
 		m_sText = pstrText;
 		m_sText = pstrText;
 		if( m_pWindow != NULL ) Edit_SetText(*m_pWindow, m_sText);
 		if( m_pWindow != NULL ) Edit_SetText(*m_pWindow, m_sText);
 		Invalidate();
 		Invalidate();

+ 92 - 1
DuiLib/Core/UIManager.cpp

@@ -1329,6 +1329,16 @@ namespace DuiLib
 			m_pEventClick = pControl;
 			m_pEventClick = pControl;
 		// 触摸没有悬浮语义;整个手势期间以及抬起后的合成鼠标移动都不应重建 HOT。
 		// 触摸没有悬浮语义;整个手势期间以及抬起后的合成鼠标移动都不应重建 HOT。
 		s_bSuppressHoverAfterTouch = true;
 		s_bSuppressHoverAfterTouch = true;
+		{
+			// 【诊断 · 新建商品弹框「输入文字消失」】记下"这一手把谁选成焦点目标"。
+			// 特别注意 isScrollBar=1 的情形:命中滚动条时**不会**设置 m_pEventClick
+			// (见上面那行 if),抬手时的合成点击就没有候选目标 ⇒ 点击被静默丢弃,
+			// 输入框永远拿不到焦点。
+			CDuiString sName = pControl->GetName();
+			DuiLibDiag::Log(_T("TOUCH-DOWN focusTarget=%s/%s isScrollBar=%d pt=%d,%d nFocusBefore=%p"),
+				sName.GetData(), pControl->GetClass(), (int)(bTouchIsScrollBar ? 1 : 0),
+				pt.x, pt.y, (void*)::GetFocus());
+		}
 		pControl->SetFocus();
 		pControl->SetFocus();
 		SetCapture();                              // mgr 级:m_bMouseCapture=true + ::SetCapture
 		SetCapture();                              // mgr 级:m_bMouseCapture=true + ::SetCapture
 
 
@@ -2061,6 +2071,21 @@ namespace DuiLib
 			// 超时自愈由专门的 m_dwPointerDownTick 计时,两者职责分离、互不干扰。
 			// 超时自愈由专门的 m_dwPointerDownTick 计时,两者职责分离、互不干扰。
 			// 与 WM_LBUTTONDOWN 分支一致:先把焦点给本窗口,否则输入法/键盘焦点
 			// 与 WM_LBUTTONDOWN 分支一致:先把焦点给本窗口,否则输入法/键盘焦点
 			// 可能仍停在别的窗口上(真模态下更要注意别把焦点让给 owner)。
 			// 可能仍停在别的窗口上(真模态下更要注意别把焦点让给 owner)。
+			//
+			// ⚠️【诊断 · 新建商品弹框「输入文字消失」】这一行会把键盘焦点从当前
+			//   输入框的 CEditWnd 上**抢到主窗口**,而 CEditWnd 一旦失焦就会
+			//   PostMessage(WM_CLOSE) 自毁。紧接着 BeginTouchSlideGesture 里会
+			//   pControl->SetFocus();若目标恰好是"已经持有 DuiLib 焦点"的那个
+			//   控件(m_pFocus 没变),CPaintManagerUI::SetFocus 会**早退**、
+			//   不重发 UIEVENT_SETFOCUS ⇒ 编辑窗口不会被重建 ⇒ 输入永久失效。
+			//   这正是"切到另一个框后就再也输不进去"最可能的断点,必须留痕。
+			{
+				TCHAR szBefore[128] = { 0 };
+				HWND hBefore = ::GetFocus();
+				if (hBefore != NULL && ::IsWindow(hBefore)) ::GetClassName(hBefore, szBefore, _countof(szBefore));
+				DuiLibDiag::Log(_T("PTR-DOWN stealFocus mgrHwnd=%p nFocusBefore=%p clsBefore=%s -> 即将 SetFocus(本窗口)"),
+					(void*)m_hWndPaint, (void*)hBefore, szBefore);
+			}
 			if (!m_bNoActivate) ::SetFocus(m_hWndPaint);
 			if (!m_bNoActivate) ::SetFocus(m_hWndPaint);
 
 
 			// ---- [通道无关滑动] 指针通道也要建立滑动状态机 ----
 			// ---- [通道无关滑动] 指针通道也要建立滑动状态机 ----
@@ -4754,6 +4779,8 @@ namespace DuiLib
 			return true;
 			return true;
 			case WM_SETFOCUS:
 			case WM_SETFOCUS:
 			{
 			{
+				DuiLibDiag::Log(_T("WND-SETFOCUS mgrHwnd=%p nFocus=%p owner=%p"),
+					(void*)m_hWndPaint, (void*)::GetFocus(), (void*)::GetWindow(m_hWndPaint, GW_OWNER));
 				if (m_pFocus != NULL)
 				if (m_pFocus != NULL)
 				{
 				{
 					TEventUI event = { 0 };
 					TEventUI event = { 0 };
@@ -4768,9 +4795,56 @@ namespace DuiLib
 			}
 			}
 			case WM_KILLFOCUS:
 			case WM_KILLFOCUS:
 			{
 			{
+				DuiLibDiag::Log(_T("WND-KILLFOCUS mgrHwnd=%p nFocus=%p owner=%p -> 本窗口失去键盘焦点"),
+					(void*)m_hWndPaint, (void*)::GetFocus(), (void*)::GetWindow(m_hWndPaint, GW_OWNER));
 				if (IsCaptured()) ReleaseCapture();
 				if (IsCaptured()) ReleaseCapture();
 				break;
 				break;
 			}
 			}
+			case WM_ACTIVATE:
+			{
+				// 【诊断】记录"谁被激活 / 谁抢走了前台"。
+				//
+				// WA_INACTIVE(=0) 一出现,就说明"有别的窗口被激活了"。这正是
+				// "手指点触摸键盘"与"鼠标点触摸键盘"最可能分道扬镳的地方:
+				// 触摸键盘是**另一个进程**的窗口,一旦它夺走前台,本窗口的键盘焦点
+				// 就会被系统判为失效 —— 而 CEditWnd 一失焦就自毁(见 UIEdit.cpp),
+				// 于是之后所有按键(含退格)都无处可去。
+				TCHAR szFgCls[128] = { 0 };
+				HWND hFg = ::GetForegroundWindow();
+				if (hFg != NULL && ::IsWindow(hFg)) ::GetClassName(hFg, szFgCls, _countof(szFgCls));
+				DuiLibDiag::Log(_T("WND-ACTIVATE mgrHwnd=%p wParam=%u(0=INACTIVE) nFocus=%p selfTid=%u fg=%p fgClass=%s fgTid=%u"),
+					(void*)m_hWndPaint, (unsigned)LOWORD(wParam), (void*)::GetFocus(),
+					(unsigned)::GetCurrentThreadId(), (void*)hFg, szFgCls,
+					(unsigned)(hFg != NULL ? ::GetWindowThreadProcessId(hFg, NULL) : 0));
+
+				// ★ 修复(2026-09-22):重新获得激活时,把焦点"还回"给 DuiLib 当前
+				//   聚焦的控件 —— 与上面 WM_SETFOCUS 分支完全同构。
+				//
+				// 为什么必须补这一步(真机日志实证):
+				//   1) 手指点触摸键盘会让**另一个进程**(TabTip / TextInputHost)夺走前台
+				//      ⇒ 本窗口收到 WA_INACTIVE,本线程的键盘焦点被系统置空;
+				//   2) 那一刻 CEditWnd 收到 WM_KILLFOCUS,按设计 PostMessage(WM_CLOSE)
+				//      **把原生 EDIT 子窗口销毁**(EDIT-KILLFOCUS newFocus=00000000
+				//      newTid=0 sameProc=0 ⇒ 焦点离开了本线程);
+				//   3) 等我们重新被激活时,那个子窗口**已经不存在了**;而
+				//      CPaintManagerUI::SetFocus 有 `pControl == m_pFocus` 早退,
+				//      不会重发 UIEVENT_SETFOCUS ⇒ **没有任何路径重建它**
+				//      ⇒ 用户体感"切一次输入框之后就再也输不进去、连退格都无效"。
+				//   4) CEditUI::DoEvent 收到 UIEVENT_SETFOCUS 后会自己补建/补焦点
+				//      (m_pWindow == NULL ⇒ new CEditWnd;否则 Show+SetFocus)。
+				//   ⇒ 只要在这里重发一次,输入能力就自动恢复,且**全程无时间戳**。
+				if (LOWORD(wParam) != WA_INACTIVE && m_pFocus != NULL)
+				{
+					TEventUI event = { 0 };
+					event.Type = UIEVENT_SETFOCUS;
+					event.wParam = wParam;
+					event.lParam = lParam;
+					event.pSender = m_pFocus;
+					event.dwTimestamp = ::GetTickCount();
+					m_pFocus->Event(event);
+				}
+				break;
+			}
 			case WM_NOTIFY:
 			case WM_NOTIFY:
 			{
 			{
 				if (lParam == 0) break;
 				if (lParam == 0) break;
@@ -5173,11 +5247,28 @@ namespace DuiLib
 
 
 	void CPaintManagerUI::SetFocus(CControlUI* pControl)
 	void CPaintManagerUI::SetFocus(CControlUI* pControl)
 	{
 	{
+		// 【诊断 · 新建商品弹框「输入文字消失」】焦点流向必须可见 ——
+		// 本函数是"究竟哪个控件拿到了 DuiLib 侧焦点"的唯一权威入口。
+		// 重点看 `pControl == m_pFocus` 的那条早退:它**不会**重新派发
+		// UIEVENT_SETFOCUS,因此也**不会**重建已被销毁的原生编辑窗口
+		// (CEditWnd 失焦即自毁,见 UIEdit.cpp 的 EDIT-KILLFOCUS)。
+		{
+			CDuiString sTarget = (pControl != NULL) ? pControl->GetName() : CDuiString(_T("NULL"));
+			CDuiString sCur = (m_pFocus != NULL) ? m_pFocus->GetName() : CDuiString(_T("NULL"));
+			DuiLibDiag::Log(_T("MGR-SETFOCUS enter target=%s/%s cur=%s/%s nFocus=%p mgrHwnd=%p"),
+				sTarget.GetData(), (pControl != NULL) ? pControl->GetClass() : _T("-"),
+				sCur.GetData(), (m_pFocus != NULL) ? m_pFocus->GetClass() : _T("-"),
+				(void*)::GetFocus(), (void*)m_hWndPaint);
+		}
 		// Paint manager window has focus?
 		// Paint manager window has focus?
 		HWND hFocusWnd = ::GetFocus();
 		HWND hFocusWnd = ::GetFocus();
 		if (!m_bNoActivate && hFocusWnd != m_hWndPaint && pControl != m_pFocus) ::SetFocus(m_hWndPaint);
 		if (!m_bNoActivate && hFocusWnd != m_hWndPaint && pControl != m_pFocus) ::SetFocus(m_hWndPaint);
 		// Already has focus?
 		// Already has focus?
-		if (pControl == m_pFocus) return;
+		if (pControl == m_pFocus)
+		{
+			DuiLibDiag::Log(_T("MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS"));
+			return;
+		}
 		// Remove focus from old control
 		// Remove focus from old control
 		if (m_pFocus != NULL)
 		if (m_pFocus != NULL)
 		{
 		{

BIN
bin/Win32/Debug/zhipuzi_pos_windows/DuiLib_d.dll


+ 221 - 0
bin/Win32/Debug/zhipuzi_pos_windows/touch_trace.log

@@ -0,0 +1,221 @@
+[217261968][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=00000000 mgrHwnd=0014162C
+[217261968][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217261968][T12440] EDITUI-SETTEXT owner=accountedit m_pWindow=00000000 old='' new='liantongxue'
+[217261968][T12440] EDITUI-SETTEXT owner=pwdedit m_pWindow=00000000 old='' new='hhyz122131'
+[217261968][T12440] WND-ACTIVATE mgrHwnd=0014162C wParam=1(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=0014162C fgClass=UILoginFrame fgTid=12440
+[217262281][T12440] WND-SETFOCUS mgrHwnd=0014162C nFocus=0014162C owner=00000000
+[217263375][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=0014162C mgrHwnd=000B15A6
+[217263375][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217263390][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=0014162C mgrHwnd=003208CE
+[217263390][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217263390][T12440] WND-ACTIVATE mgrHwnd=0014162C wParam=0(0=INACTIVE) nFocus=0014162C selfTid=12440 fg=0014162C fgClass=UILoginFrame fgTid=12440
+[217263390][T12440] WND-ACTIVATE mgrHwnd=003208CE wParam=1(0=INACTIVE) nFocus=0014162C selfTid=12440 fg=003208CE fgClass=UIMemoWndFrame fgTid=12440
+[217263390][T12440] WND-KILLFOCUS mgrHwnd=0014162C nFocus=003208CE owner=00000000 -> 本窗口失去键盘焦点
+[217263390][T12440] WND-SETFOCUS mgrHwnd=003208CE nFocus=003208CE owner=000B15A6
+[217263484][T12440] EDITUI-SETTEXT owner=setting_tiaomacheng_ip m_pWindow=00000000 old='' new=''
+[217263484][T12440] EDITUI-SETTEXT owner=setting_biaoqian_printer_wangkou_ip m_pWindow=00000000 old='' new=''
+[217263546][T12440] WND-ACTIVATE mgrHwnd=003208CE wParam=0(0=INACTIVE) nFocus=003208CE selfTid=12440 fg=003208CE fgClass=UIMemoWndFrame fgTid=12440
+[217263562][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=003208CE selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217263562][T12440] WND-KILLFOCUS mgrHwnd=003208CE nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217263562][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217263625][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=000B15A6 mgrHwnd=0014162C
+[217263625][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217264593][T12440] MGR-SETFOCUS enter target=main_huiyuan/OptionUI cur=NULL/- nFocus=000B15A6 mgrHwnd=000B15A6
+[217267468][T12440] MGR-SETFOCUS enter target=main_diandan/OptionUI cur=main_huiyuan/OptionUI nFocus=000B15A6 mgrHwnd=000B15A6
+[217268843][T12440] MGR-SETFOCUS enter target=main_shangpin/OptionUI cur=main_diandan/OptionUI nFocus=000B15A6 mgrHwnd=000B15A6
+[217269765][T12440] MGR-SETFOCUS enter target=shangpin_page_add_btn/ButtonUI cur=main_shangpin/OptionUI nFocus=000B15A6 mgrHwnd=000B15A6
+[217269875][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=000B15A6 mgrHwnd=00EB08FC
+[217269875][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_name_edit m_pWindow=00000000 old='' new=''
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_xuhao_edit m_pWindow=00000000 old='' new=''
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_barcode_edit m_pWindow=00000000 old='' new=''
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_price_edit m_pWindow=00000000 old='' new=''
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_unit_edit m_pWindow=00000000 old='' new=''
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_plu m_pWindow=00000000 old='' new=''
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_kucun_now m_pWindow=00000000 old='' new='0'
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_buyingprice_edit m_pWindow=00000000 old='' new='0'
+[217269890][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_dabao_money m_pWindow=00000000 old='' new='0'
+[217269890][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217269890][T12440] WND-ACTIVATE mgrHwnd=00EB08FC wParam=1(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=00EB08FC fgClass=UIShangpinCreateWndFrame fgTid=12440
+[217269906][T12440] WND-SETFOCUS mgrHwnd=00EB08FC nFocus=00EB08FC owner=000B15A6
+[217269906][T12440] WND-ACTIVATE mgrHwnd=00EB08FC wParam=0(0=INACTIVE) nFocus=00EB08FC selfTid=12440 fg=00EB08FC fgClass=UIShangpinCreateWndFrame fgTid=12440
+[217269906][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00EB08FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217269921][T12440] WND-KILLFOCUS mgrHwnd=00EB08FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217269921][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217269921][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217269921][T12440] WND-ACTIVATE mgrHwnd=00EC08FC wParam=1(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=00EC08FC fgClass=#32770 fgTid=12440
+[217269937][T12440] WND-SETFOCUS mgrHwnd=00EC08FC nFocus=00EC08FC owner=000B15A6
+[217269937][T12440] WND-KILLFOCUS mgrHwnd=00EC08FC nFocus=00EC08FC owner=000B15A6 -> 本窗口失去键盘焦点
+[217269937][T12440] WND-SETFOCUS mgrHwnd=00EC08FC nFocus=00EC08FC owner=000B15A6
+[217269937][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_name_edit/EditUI cur=NULL/- nFocus=00EC08FC mgrHwnd=00EC08FC
+[217269937][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=0 m_pWindow=00000000 editHwnd=00000000 pt=0,0 nFocus=00EC08FC mgrHwnd=00EC08FC
+[217269937][T12440] EDIT-INIT enter owner=shangpin_create_dlg_name_edit focused=0 ownerHwnd(old)=00000000 text='' nFocus=00EC08FC focusClass=#32770 focusTid=12440 selfTid=12440
+[217269953][T12440] WND-KILLFOCUS mgrHwnd=00EC08FC nFocus=007911C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217269953][T12440] EDIT-INIT done  owner=shangpin_create_dlg_name_edit hwnd=007911C4 nFocus=007911C4 focusIsSelf=1 sel=[0,0] text=''
+[217269953][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_name_edit/EditUI cur=shangpin_create_dlg_name_edit/EditUI nFocus=007911C4 mgrHwnd=00EC08FC
+[217269953][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217271812][T12440] EDIT-KILLFOCUS hwnd=007911C4 owner=shangpin_create_dlg_name_edit newFocus=00EC08FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217271812][T12440] WND-SETFOCUS mgrHwnd=00EC08FC nFocus=00EC08FC owner=000B15A6
+[217271812][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF6FB48 editHwnd=007911C4 pt=0,0 nFocus=00EC08FC mgrHwnd=00EC08FC
+[217271812][T12440] WND-KILLFOCUS mgrHwnd=00EC08FC nFocus=007911C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217271812][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=shangpin_create_dlg_name_edit editHwnd=007911C4 nFocus=007911C4 -> Show+SetFocus
+[217271812][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_cancel_btn/ButtonUI cur=shangpin_create_dlg_name_edit/EditUI nFocus=007911C4 mgrHwnd=00EC08FC
+[217271812][T12440] EDIT-KILLFOCUS hwnd=007911C4 owner=shangpin_create_dlg_name_edit newFocus=00EC08FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217271812][T12440] WND-SETFOCUS mgrHwnd=00EC08FC nFocus=00EC08FC owner=000B15A6
+[217271828][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF6FB48 editHwnd=007911C4 pt=0,0 nFocus=00EC08FC mgrHwnd=00EC08FC
+[217271828][T12440] WND-KILLFOCUS mgrHwnd=00EC08FC nFocus=007911C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217271828][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=shangpin_create_dlg_name_edit editHwnd=007911C4 nFocus=007911C4 -> Show+SetFocus
+[217271828][T12440] EDITUI-EVENT type=28 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF6FB48 editHwnd=007911C4 pt=0,0 nFocus=007911C4 mgrHwnd=00EC08FC
+[217271828][T12440] EDIT-KILLFOCUS hwnd=007911C4 owner=shangpin_create_dlg_name_edit newFocus=00EC08FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217271828][T12440] WND-SETFOCUS mgrHwnd=00EC08FC nFocus=00EC08FC owner=000B15A6
+[217271828][T12440] EDIT-FIN hwnd=007911C4 owner=shangpin_create_dlg_name_edit text='' nFocus=00EC08FC
+[217271937][T12440] WND-ACTIVATE mgrHwnd=00EC08FC wParam=0(0=INACTIVE) nFocus=00EC08FC selfTid=12440 fg=00EC08FC fgClass=#32770 fgTid=12440
+[217271937][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00EC08FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217271937][T12440] WND-KILLFOCUS mgrHwnd=00EC08FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217271937][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217272562][T12440] MGR-SETFOCUS enter target=shangpin_page_add_type_btn/ButtonUI cur=shangpin_page_add_btn/ButtonUI nFocus=000B15A6 mgrHwnd=000B15A6
+[217272687][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=000B15A6 mgrHwnd=00ED08FC
+[217272687][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217272687][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217272687][T12440] WND-ACTIVATE mgrHwnd=00ED08FC wParam=1(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=00ED08FC fgClass=UIMemoWndFrame fgTid=12440
+[217272687][T12440] WND-SETFOCUS mgrHwnd=00ED08FC nFocus=00ED08FC owner=000B15A6
+[217272703][T12440] WND-ACTIVATE mgrHwnd=00ED08FC wParam=0(0=INACTIVE) nFocus=00ED08FC selfTid=12440 fg=00ED08FC fgClass=UIMemoWndFrame fgTid=12440
+[217272703][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00ED08FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217272718][T12440] WND-KILLFOCUS mgrHwnd=00ED08FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217272718][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217272718][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217272734][T12440] WND-ACTIVATE mgrHwnd=00EE08FC wParam=1(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=00EE08FC fgClass=#32770 fgTid=12440
+[217272734][T12440] WND-SETFOCUS mgrHwnd=00EE08FC nFocus=00EE08FC owner=000B15A6
+[217272734][T12440] WND-KILLFOCUS mgrHwnd=00EE08FC nFocus=00EE08FC owner=000B15A6 -> 本窗口失去键盘焦点
+[217272734][T12440] WND-SETFOCUS mgrHwnd=00EE08FC nFocus=00EE08FC owner=000B15A6
+[217272734][T12440] MGR-SETFOCUS enter target=fenlei_create_page_name_edit/EditUI cur=NULL/- nFocus=00EE08FC mgrHwnd=00EE08FC
+[217272734][T12440] EDITUI-EVENT type=29 owner=fenlei_create_page_name_edit m_bFocused=0 m_pWindow=00000000 editHwnd=00000000 pt=0,0 nFocus=00EE08FC mgrHwnd=00EE08FC
+[217272734][T12440] EDIT-INIT enter owner=fenlei_create_page_name_edit focused=0 ownerHwnd(old)=00000000 text='' nFocus=00EE08FC focusClass=#32770 focusTid=12440 selfTid=12440
+[217272750][T12440] WND-KILLFOCUS mgrHwnd=00EE08FC nFocus=007B11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217272750][T12440] EDIT-INIT done  owner=fenlei_create_page_name_edit hwnd=007B11C4 nFocus=007B11C4 focusIsSelf=1 sel=[0,0] text=''
+[217272750][T12440] MGR-SETFOCUS enter target=fenlei_create_page_name_edit/EditUI cur=fenlei_create_page_name_edit/EditUI nFocus=007B11C4 mgrHwnd=00EE08FC
+[217272750][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217274046][T12440] EDIT-KILLFOCUS hwnd=007B11C4 owner=fenlei_create_page_name_edit newFocus=00EE08FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217274046][T12440] WND-SETFOCUS mgrHwnd=00EE08FC nFocus=00EE08FC owner=000B15A6
+[217274046][T12440] EDITUI-EVENT type=29 owner=fenlei_create_page_name_edit m_bFocused=1 m_pWindow=0DF6FCC8 editHwnd=007B11C4 pt=0,0 nFocus=00EE08FC mgrHwnd=00EE08FC
+[217274046][T12440] WND-KILLFOCUS mgrHwnd=00EE08FC nFocus=007B11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217274062][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=fenlei_create_page_name_edit editHwnd=007B11C4 nFocus=007B11C4 -> Show+SetFocus
+[217274062][T12440] MGR-SETFOCUS enter target=fenlei_create_page_cancel_btn/ButtonUI cur=fenlei_create_page_name_edit/EditUI nFocus=007B11C4 mgrHwnd=00EE08FC
+[217274062][T12440] EDIT-KILLFOCUS hwnd=007B11C4 owner=fenlei_create_page_name_edit newFocus=00EE08FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217274062][T12440] WND-SETFOCUS mgrHwnd=00EE08FC nFocus=00EE08FC owner=000B15A6
+[217274062][T12440] EDITUI-EVENT type=29 owner=fenlei_create_page_name_edit m_bFocused=1 m_pWindow=0DF6FCC8 editHwnd=007B11C4 pt=0,0 nFocus=00EE08FC mgrHwnd=00EE08FC
+[217274062][T12440] WND-KILLFOCUS mgrHwnd=00EE08FC nFocus=007B11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217274062][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=fenlei_create_page_name_edit editHwnd=007B11C4 nFocus=007B11C4 -> Show+SetFocus
+[217274062][T12440] EDITUI-EVENT type=28 owner=fenlei_create_page_name_edit m_bFocused=1 m_pWindow=0DF6FCC8 editHwnd=007B11C4 pt=0,0 nFocus=007B11C4 mgrHwnd=00EE08FC
+[217274078][T12440] EDIT-KILLFOCUS hwnd=007B11C4 owner=fenlei_create_page_name_edit newFocus=00EE08FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217274078][T12440] WND-SETFOCUS mgrHwnd=00EE08FC nFocus=00EE08FC owner=000B15A6
+[217274078][T12440] EDIT-FIN hwnd=007B11C4 owner=fenlei_create_page_name_edit text='' nFocus=00EE08FC
+[217274140][T12440] WND-ACTIVATE mgrHwnd=00EE08FC wParam=0(0=INACTIVE) nFocus=00EE08FC selfTid=12440 fg=00EE08FC fgClass=#32770 fgTid=12440
+[217274140][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00EE08FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217274140][T12440] WND-KILLFOCUS mgrHwnd=00EE08FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217274140][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217274437][T12440] MGR-SETFOCUS enter target=shangpin_page_add_btn/ButtonUI cur=shangpin_page_add_type_btn/ButtonUI nFocus=000B15A6 mgrHwnd=000B15A6
+[217274546][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=000B15A6 mgrHwnd=00EF08FC
+[217274546][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_name_edit m_pWindow=00000000 old='' new=''
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_xuhao_edit m_pWindow=00000000 old='' new=''
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_barcode_edit m_pWindow=00000000 old='' new=''
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_price_edit m_pWindow=00000000 old='' new=''
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_unit_edit m_pWindow=00000000 old='' new=''
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_plu m_pWindow=00000000 old='' new=''
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_kucun_now m_pWindow=00000000 old='' new='0'
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_buyingprice_edit m_pWindow=00000000 old='' new='0'
+[217274546][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_dabao_money m_pWindow=00000000 old='' new='0'
+[217274546][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217274562][T12440] WND-ACTIVATE mgrHwnd=00EF08FC wParam=1(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=00EF08FC fgClass=UIShangpinCreateWndFrame fgTid=12440
+[217274562][T12440] WND-SETFOCUS mgrHwnd=00EF08FC nFocus=00EF08FC owner=000B15A6
+[217274578][T12440] WND-ACTIVATE mgrHwnd=00EF08FC wParam=0(0=INACTIVE) nFocus=00EF08FC selfTid=12440 fg=00EF08FC fgClass=UIShangpinCreateWndFrame fgTid=12440
+[217274578][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00EF08FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217274578][T12440] WND-KILLFOCUS mgrHwnd=00EF08FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217274578][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217274593][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217274593][T12440] WND-ACTIVATE mgrHwnd=00F008FC wParam=1(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=00F008FC fgClass=#32770 fgTid=12440
+[217274593][T12440] WND-SETFOCUS mgrHwnd=00F008FC nFocus=00F008FC owner=000B15A6
+[217274593][T12440] WND-KILLFOCUS mgrHwnd=00F008FC nFocus=00F008FC owner=000B15A6 -> 本窗口失去键盘焦点
+[217274593][T12440] WND-SETFOCUS mgrHwnd=00F008FC nFocus=00F008FC owner=000B15A6
+[217274609][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_name_edit/EditUI cur=NULL/- nFocus=00F008FC mgrHwnd=00F008FC
+[217274609][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=0 m_pWindow=00000000 editHwnd=00000000 pt=0,0 nFocus=00F008FC mgrHwnd=00F008FC
+[217274609][T12440] EDIT-INIT enter owner=shangpin_create_dlg_name_edit focused=0 ownerHwnd(old)=00000000 text='' nFocus=00F008FC focusClass=#32770 focusTid=12440 selfTid=12440
+[217274609][T12440] WND-KILLFOCUS mgrHwnd=00F008FC nFocus=007D11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217274609][T12440] EDIT-INIT done  owner=shangpin_create_dlg_name_edit hwnd=007D11C4 nFocus=007D11C4 focusIsSelf=1 sel=[0,0] text=''
+[217274609][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_name_edit/EditUI cur=shangpin_create_dlg_name_edit/EditUI nFocus=007D11C4 mgrHwnd=00F008FC
+[217274609][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217282671][T12440] EDIT-KILLFOCUS hwnd=007D11C4 owner=shangpin_create_dlg_name_edit newFocus=00F008FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217282687][T12440] WND-SETFOCUS mgrHwnd=00F008FC nFocus=00F008FC owner=000B15A6
+[217282687][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF6FF68 editHwnd=007D11C4 pt=0,0 nFocus=00F008FC mgrHwnd=00F008FC
+[217282687][T12440] WND-KILLFOCUS mgrHwnd=00F008FC nFocus=007D11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217282687][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=shangpin_create_dlg_name_edit editHwnd=007D11C4 nFocus=007D11C4 -> Show+SetFocus
+[217282687][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_cancel_btn/ButtonUI cur=shangpin_create_dlg_name_edit/EditUI nFocus=007D11C4 mgrHwnd=00F008FC
+[217282687][T12440] EDIT-KILLFOCUS hwnd=007D11C4 owner=shangpin_create_dlg_name_edit newFocus=00F008FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217282687][T12440] WND-SETFOCUS mgrHwnd=00F008FC nFocus=00F008FC owner=000B15A6
+[217282687][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF6FF68 editHwnd=007D11C4 pt=0,0 nFocus=00F008FC mgrHwnd=00F008FC
+[217282687][T12440] WND-KILLFOCUS mgrHwnd=00F008FC nFocus=007D11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217282687][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=shangpin_create_dlg_name_edit editHwnd=007D11C4 nFocus=007D11C4 -> Show+SetFocus
+[217282687][T12440] EDITUI-EVENT type=28 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF6FF68 editHwnd=007D11C4 pt=0,0 nFocus=007D11C4 mgrHwnd=00F008FC
+[217282703][T12440] EDIT-KILLFOCUS hwnd=007D11C4 owner=shangpin_create_dlg_name_edit newFocus=00F008FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217282703][T12440] WND-SETFOCUS mgrHwnd=00F008FC nFocus=00F008FC owner=000B15A6
+[217282703][T12440] EDIT-FIN hwnd=007D11C4 owner=shangpin_create_dlg_name_edit text='' nFocus=00F008FC
+[217282781][T12440] WND-ACTIVATE mgrHwnd=00F008FC wParam=0(0=INACTIVE) nFocus=00F008FC selfTid=12440 fg=00F008FC fgClass=#32770 fgTid=12440
+[217282796][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00F008FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217282796][T12440] WND-KILLFOCUS mgrHwnd=00F008FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217282796][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217283140][T12440] MGR-SETFOCUS enter target=shangpin_foodlist/TileLayoutUI cur=shangpin_page_add_btn/ButtonUI nFocus=000B15A6 mgrHwnd=000B15A6
+[217283843][T12440] MGR-SETFOCUS enter target=shangpin_page_add_btn/ButtonUI cur=shangpin_foodlist/TileLayoutUI nFocus=000B15A6 mgrHwnd=000B15A6
+[217283937][T12440] MGR-SETFOCUS enter target=NULL/- cur=NULL/- nFocus=000B15A6 mgrHwnd=00F108FC
+[217283937][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_name_edit m_pWindow=00000000 old='' new=''
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_xuhao_edit m_pWindow=00000000 old='' new=''
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_barcode_edit m_pWindow=00000000 old='' new=''
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_price_edit m_pWindow=00000000 old='' new=''
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_unit_edit m_pWindow=00000000 old='' new=''
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_plu m_pWindow=00000000 old='' new=''
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_kucun_now m_pWindow=00000000 old='' new='0'
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_buyingprice_edit m_pWindow=00000000 old='' new='0'
+[217283953][T12440] EDITUI-SETTEXT owner=shangpin_create_dlg_dabao_money m_pWindow=00000000 old='' new='0'
+[217283953][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217283953][T12440] WND-ACTIVATE mgrHwnd=00F108FC wParam=1(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=00F108FC fgClass=UIShangpinCreateWndFrame fgTid=12440
+[217283953][T12440] WND-SETFOCUS mgrHwnd=00F108FC nFocus=00F108FC owner=000B15A6
+[217283968][T12440] WND-ACTIVATE mgrHwnd=00F108FC wParam=0(0=INACTIVE) nFocus=00F108FC selfTid=12440 fg=00F108FC fgClass=UIShangpinCreateWndFrame fgTid=12440
+[217283968][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00F108FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217283968][T12440] WND-KILLFOCUS mgrHwnd=00F108FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217283968][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217283984][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217283984][T12440] WND-ACTIVATE mgrHwnd=00F208FC wParam=1(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=00F208FC fgClass=#32770 fgTid=12440
+[217283984][T12440] WND-SETFOCUS mgrHwnd=00F208FC nFocus=00F208FC owner=000B15A6
+[217284000][T12440] WND-KILLFOCUS mgrHwnd=00F208FC nFocus=00F208FC owner=000B15A6 -> 本窗口失去键盘焦点
+[217284000][T12440] WND-SETFOCUS mgrHwnd=00F208FC nFocus=00F208FC owner=000B15A6
+[217284000][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_name_edit/EditUI cur=NULL/- nFocus=00F208FC mgrHwnd=00F208FC
+[217284000][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=0 m_pWindow=00000000 editHwnd=00000000 pt=0,0 nFocus=00F208FC mgrHwnd=00F208FC
+[217284000][T12440] EDIT-INIT enter owner=shangpin_create_dlg_name_edit focused=0 ownerHwnd(old)=00000000 text='' nFocus=00F208FC focusClass=#32770 focusTid=12440 selfTid=12440
+[217284015][T12440] WND-KILLFOCUS mgrHwnd=00F208FC nFocus=007F11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217284015][T12440] EDIT-INIT done  owner=shangpin_create_dlg_name_edit hwnd=007F11C4 nFocus=007F11C4 focusIsSelf=1 sel=[0,0] text=''
+[217284015][T12440] MGR-SETFOCUS enter target=shangpin_create_dlg_name_edit/EditUI cur=shangpin_create_dlg_name_edit/EditUI nFocus=007F11C4 mgrHwnd=00F208FC
+[217284015][T12440] MGR-SETFOCUS 早退(目标已持有焦点) -> 不重发 UIEVENT_SETFOCUS
+[217285515][T12440] EDIT-KILLFOCUS hwnd=007F11C4 owner=shangpin_create_dlg_name_edit newFocus=00F208FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217285515][T12440] WND-SETFOCUS mgrHwnd=00F208FC nFocus=00F208FC owner=000B15A6
+[217285515][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF70268 editHwnd=007F11C4 pt=0,0 nFocus=00F208FC mgrHwnd=00F208FC
+[217285515][T12440] WND-KILLFOCUS mgrHwnd=00F208FC nFocus=007F11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217285515][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=shangpin_create_dlg_name_edit editHwnd=007F11C4 nFocus=007F11C4 -> Show+SetFocus
+[217285515][T12440] MGR-SETFOCUS enter target=closebtn/ButtonUI cur=shangpin_create_dlg_name_edit/EditUI nFocus=007F11C4 mgrHwnd=00F208FC
+[217285531][T12440] EDIT-KILLFOCUS hwnd=007F11C4 owner=shangpin_create_dlg_name_edit newFocus=00F208FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217285531][T12440] WND-SETFOCUS mgrHwnd=00F208FC nFocus=00F208FC owner=000B15A6
+[217285531][T12440] EDITUI-EVENT type=29 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF70268 editHwnd=007F11C4 pt=0,0 nFocus=00F208FC mgrHwnd=00F208FC
+[217285531][T12440] WND-KILLFOCUS mgrHwnd=00F208FC nFocus=007F11C4 owner=000B15A6 -> 本窗口失去键盘焦点
+[217285531][T12440] EDITUI-SETFOCUS 复用编辑窗 owner=shangpin_create_dlg_name_edit editHwnd=007F11C4 nFocus=007F11C4 -> Show+SetFocus
+[217285531][T12440] EDITUI-EVENT type=28 owner=shangpin_create_dlg_name_edit m_bFocused=1 m_pWindow=0DF70268 editHwnd=007F11C4 pt=0,0 nFocus=007F11C4 mgrHwnd=00F208FC
+[217285531][T12440] EDIT-KILLFOCUS hwnd=007F11C4 owner=shangpin_create_dlg_name_edit newFocus=00F208FC newClass=#32770 newTid=12440 selfTid=12440 sameProc=1 -> 即将 WM_CLOSE 自毁
+[217285531][T12440] WND-SETFOCUS mgrHwnd=00F208FC nFocus=00F208FC owner=000B15A6
+[217285531][T12440] EDIT-FIN hwnd=007F11C4 owner=shangpin_create_dlg_name_edit text='' nFocus=00F208FC
+[217286171][T12440] WND-ACTIVATE mgrHwnd=00F208FC wParam=0(0=INACTIVE) nFocus=00F208FC selfTid=12440 fg=00F208FC fgClass=#32770 fgTid=12440
+[217286171][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00F208FC selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217286171][T12440] WND-KILLFOCUS mgrHwnd=00F208FC nFocus=000B15A6 owner=000B15A6 -> 本窗口失去键盘焦点
+[217286171][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217287375][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=0(0=INACTIVE) nFocus=000B15A6 selfTid=12440 fg=011000AE fgClass=WeWorkWindow fgTid=14264
+[217297843][T12440] WND-ACTIVATE mgrHwnd=000B15A6 wParam=1(0=INACTIVE) nFocus=00000000 selfTid=12440 fg=000B15A6 fgClass=UIMainFrame fgTid=12440
+[217297859][T12440] WND-SETFOCUS mgrHwnd=000B15A6 nFocus=000B15A6 owner=00000000
+[217299468][T12440] MGR-SETFOCUS enter target=closebtn/ButtonUI cur=shangpin_page_add_btn/ButtonUI nFocus=000B15A6 mgrHwnd=000B15A6

BIN
bin/Win32/Release/zhipuzi_pos_windows/DuiLib.dll


BIN
bin/Win32/Release/zhipuzi_pos_windows/zhipuzi_pos_windows.exe


BIN
dll/debug/DuiLib_d.dll


BIN
dll/release/DuiLib.dll


BIN
lib/debug/DuiLib_d.lib


BIN
pdb/release/DuiLib.pdb


+ 18 - 0
zhipuzi_pos_windows/helper/CSystem.cpp

@@ -543,6 +543,16 @@ bool CSystem::RunHidden(const std::wstring& commandLine)
 
 
 void CSystem::ShowSystemKeyboard(HWND hwnd)
 void CSystem::ShowSystemKeyboard(HWND hwnd)
 {
 {
+	// 【诊断】只记录,**不改变任何行为** —— 键盘的显示/收起逻辑按用户要求原样保留。
+	// 唯一需要留意的事实:ITipInvocation::Toggle 是**切换**语义(不是"显示"),
+	// 所以"调了几次"直接决定键盘最后是开还是关。tipVisible 用来判断
+	// "这一次调用到底把键盘打开了还是关掉了"(配合 SYS-KB Toggle done 的 after 值)。
+	HWND hTipProbe = ::FindWindowW(L"IPTip_Main_Window", nullptr);
+	const BOOL bTipVisible = (hTipProbe != nullptr && ::IsWindowVisible(hTipProbe));
+	LOG_INFO("SYS-KB Show enter hwnd=" << (INT_PTR)hwnd
+		<< " tipWnd=" << (INT_PTR)hTipProbe
+		<< " tipVisible=" << (int)bTipVisible);
+
 	// Win10+ 优先使用 TabTip 的 Toggle(更接近托盘点击行为)
 	// Win10+ 优先使用 TabTip 的 Toggle(更接近托盘点击行为)
 	if (CSystem::GetWindowsMajorVersion() >= 6)
 	if (CSystem::GetWindowsMajorVersion() >= 6)
 	{
 	{
@@ -574,6 +584,10 @@ void CSystem::ShowSystemKeyboard(HWND hwnd)
 			hr = pTip->Toggle(hwnd);
 			hr = pTip->Toggle(hwnd);
 			pTip->Release();
 			pTip->Release();
 
 
+			HWND hTipAfter = ::FindWindowW(L"IPTip_Main_Window", nullptr);
+			LOG_INFO("SYS-KB Toggle done hr=" << (INT_PTR)hr
+				<< " tipVisibleAfter=" << (int)(hTipAfter != nullptr && ::IsWindowVisible(hTipAfter)));
+
 			if (needUninit) ::CoUninitialize();
 			if (needUninit) ::CoUninitialize();
 			if (SUCCEEDED(hr)) return;
 			if (SUCCEEDED(hr)) return;
 		}
 		}
@@ -608,8 +622,12 @@ void CSystem::HideSystemKeyboard()
 {
 {
 	// Windows 10+ 触摸键盘 TabTip.exe 的主窗口。
 	// Windows 10+ 触摸键盘 TabTip.exe 的主窗口。
 	HWND hTabTipWnd = ::FindWindowW(L"IPTip_Main_Window", nullptr);
 	HWND hTabTipWnd = ::FindWindowW(L"IPTip_Main_Window", nullptr);
+	LOG_INFO("SYS-KB Hide enter tipWnd=" << (INT_PTR)hTabTipWnd
+		<< " tipVisible=" << (int)(hTabTipWnd != nullptr && ::IsWindowVisible(hTabTipWnd)));
 	if (hTabTipWnd != nullptr)
 	if (hTabTipWnd != nullptr)
 	{
 	{
+		// 注意:这是**异步**的(只投递消息)。若紧跟着又调 ShowSystemKeyboard
+		// (实为 Toggle),两者会互相打架 —— 排序信息看 pos.log 里的时间戳即可。
 		::PostMessageW(hTabTipWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
 		::PostMessageW(hTabTipWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
 	}
 	}
 }
 }

+ 13 - 0
zhipuzi_pos_windows/ui/CModalWnd.cpp

@@ -20,6 +20,19 @@ void CModalWnd::Notify(DuiLib::TNotifyUI& msg)
 		return;
 		return;
 	}
 	}
 
 
+	const bool bSetFocus = (msg.sType == _T("setfocus"));
+	const bool bKillFocus = (msg.sType == _T("killfocus"));
+
+	// 【诊断】键盘收/放中枢每次被通知都留痕(写 log\pos.log),
+	// 便于和 DuiLib 侧的 touch_trace.log 对齐时间线。
+	//   stillActive / focusWnd 只是记录当时的现场,**不参与任何判断** ——
+	//   键盘的显示与收起逻辑保持原样。
+	LOG_INFO("MODALWND-KB evt=" << (bSetFocus ? "setfocus" : (bKillFocus ? "killfocus" : "other"))
+		<< " selfWnd=" << (INT_PTR)m_hWnd
+		<< " activeWnd=" << (INT_PTR)::GetActiveWindow()
+		<< " focusWnd=" << (INT_PTR)::GetFocus()
+		<< " stillActive=" << (int)(::GetActiveWindow() == m_hWnd ? 1 : 0));
+
 	if (msg.sType == _T("setfocus"))
 	if (msg.sType == _T("setfocus"))
 	{
 	{
 		if (CSetting::GetInstance()->GetParam("setting_xianshi_is_chumojianpan") == "1")
 		if (CSetting::GetInstance()->GetParam("setting_xianshi_is_chumojianpan") == "1")