Browse Source

框架优化

张洋 6 days ago
parent
commit
35d0c81384
3 changed files with 0 additions and 146 deletions
  1. 0 92
      DuiLib/Core/UIBase.cpp
  2. 0 45
      DuiLib/Utils/UIDiag.cpp
  3. 0 9
      DuiLib/Utils/UIDiag.h

+ 0 - 92
DuiLib/Core/UIBase.cpp

@@ -112,75 +112,6 @@ namespace {
     void SetDetachedManager(DuiLib::CPaintManagerUI* pManager) { g_pDetachedManager = pManager; }
     DuiLib::CPaintManagerUI* GetDetachedManager() { return g_pDetachedManager; }
 
-    // -------------------------------------------------------------------------
-    // 【R49d · 临时诊断】"ESC / 回车到底被谁收走了" —— 线程局部 WH_GETMESSAGE 嗅探。
-    //
-    // 真模态弹框的 ESC / 回车有三条消失路径,前两条在窗口过程里能看见,
-    // **第三条只有在"消息出队、但还没被派发"时才能看见**:
-    //   ① DispatchMessage 直接派发给弹框
-    //      (我们回答 WM_GETDLGCODE = DLGC_WANTALLKEYS 之后就应该走这条);
-    //   ② 被 IsDialogMessage 改写成 WM_COMMAND(IDCANCEL / IDOK)
-    //      (__DialogWndProc 里再翻译回合成的 WM_KEYDOWN);
-    //   ③ 压根没投给弹框 —— 键盘焦点跑去了别的窗口(主窗口 / 屏幕键盘 / 别的进程)。
-    // WH_GETMESSAGE 钩子正好卡在 GetMessage 返回之前,是唯一能分辨 ③ 的观察点。
-    //
-    // 只在真模态弹框存活期间安装(引用计数,嵌套弹框只装一次),只记录
-    // ESC / 回车 / Tab 三个键 ⇒ 日志量极小。输出:exe 同目录 dlgkey_trace.log。
-    //
-    // ⚠️ 纯诊断,与业务逻辑无关。问题定位后整体删除:
-    //    连同 SpawnKeySpy / StopKeySpy 两个调用点、以及 UIDiag 里的 LogKey 一起删。
-    // -------------------------------------------------------------------------
-    int   g_nKeySpyRef = 0;
-    HHOOK g_hKeySpy    = NULL;
-
-    LRESULT CALLBACK KeySpyProc(int nCode, WPARAM wParam, LPARAM lParam)
-    {
-        if (nCode == HC_ACTION)
-        {
-            const MSG* pMsg = reinterpret_cast<const MSG*>(lParam);
-            if (pMsg != NULL && (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN))
-            {
-                const unsigned nKey = (unsigned)pMsg->wParam;
-                if (nKey == VK_ESCAPE || nKey == VK_RETURN || nKey == VK_TAB)
-                {
-                    TCHAR szCls[64] = { 0 };
-                    ::GetClassName(pMsg->hwnd, szCls, 63);
-                    DuiLibDiag::LogKey(
-                        _T("[SPY] key=0x%02X target=%p cls=%s focus=%p active=%p fg=%p"),
-                        nKey, pMsg->hwnd, szCls,
-                        ::GetFocus(), ::GetActiveWindow(), ::GetForegroundWindow());
-                }
-            }
-        }
-        return ::CallNextHookEx(g_hKeySpy, nCode, wParam, lParam);
-    }
-
-    void SpawnKeySpy()
-    {
-        ++g_nKeySpyRef;
-        if (g_hKeySpy == NULL)
-        {
-            g_hKeySpy = ::SetWindowsHookEx(WH_GETMESSAGE, KeySpyProc, NULL, ::GetCurrentThreadId());
-            DuiLibDiag::LogKey(_T("[SPY] install ref=%d hook=%p tid=%u"),
-                g_nKeySpyRef, g_hKeySpy, (unsigned)::GetCurrentThreadId());
-        }
-    }
-
-    void StopKeySpy()
-    {
-        if (g_nKeySpyRef > 0) --g_nKeySpyRef;
-        if (g_nKeySpyRef <= 0)
-        {
-            g_nKeySpyRef = 0;
-            if (g_hKeySpy != NULL)
-            {
-                ::UnhookWindowsHookEx(g_hKeySpy);
-                DuiLibDiag::LogKey(_T("[SPY] uninstall hook=%p"), g_hKeySpy);
-                g_hKeySpy = NULL;
-            }
-        }
-    }
-
     // 【已移除】IsModalBlockedInputMessage —— 假模态时代的"在消息循环里丢弃发给 owner 的输入消息"。
     // 现在 ShowModal 走真模态(DialogBoxIndirectParam),系统对话框管理器自带 owner 禁用,
     // 这条兜底不但多余,还会误伤:真模态期间 owner 本就需要收到 WM_ACTIVATE/WM_KILLFOCUS 之类的
@@ -915,10 +846,6 @@ INT_PTR CALLBACK CWindowWnd::__DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, L
         pThis->HandleMessage(uMsg, wParam, lParam);
 
         ::SetFocus(hDlg);
-
-        // [R49d 诊断] 装键盘嗅探钩子(引用计数;见 KeySpyProc 的注释)。
-        SpawnKeySpy();
-
         return TRUE;    // TRUE = 我们自己设置了焦点
     }
 
@@ -935,8 +862,6 @@ LRESULT CALLBACK CWindowWnd::__DialogWndProc(HWND hWnd, UINT uMsg, WPARAM wParam
 
     if( uMsg == WM_NCDESTROY && pThis != NULL )
     {
-        // [R49d 诊断] 弹框销毁即卸载键盘嗅探(引用计数归零才真正 Unhook)。
-        StopKeySpy();
         // 顺序很关键:
         //   1) 先把窗口过程还原(此后系统调用会回到对话框默认过程);
         //   2) 再让 DefWindowProc 做标准清理;
@@ -1027,23 +952,6 @@ LRESULT CALLBACK CWindowWnd::__DialogWndProc(HWND hWnd, UINT uMsg, WPARAM wParam
     //   IsDialogMessage 吃掉(走 ②),要么被 DispatchMessage 下来(走 ①)
     //   —— 互斥,所以不会一次按键关两次弹框。
     // -------------------------------------------------------------------------
-    // [R49d 诊断] 弹框窗口过程实际收到了什么(量极小,只在 ESC/回车/Tab 与
-    //   WM_COMMAND(IDCANCEL/IDOK) 上落笔)—— 用来分辨"被 IsDialogMessage 改写了"
-    //   还是"原样派发下来了"。
-    if( uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN )
-    {
-        const unsigned nKey = (unsigned)wParam;
-        if( nKey == VK_ESCAPE || nKey == VK_RETURN || nKey == VK_TAB )
-            DuiLibDiag::LogKey(_T("[DLGWP] KEYDOWN key=0x%02X hwnd=%p focus=%p"),
-                nKey, hWnd, ::GetFocus());
-    }
-    else if( uMsg == WM_COMMAND )
-    {
-        const unsigned nId = (unsigned)LOWORD(wParam);
-        if( nId == IDCANCEL || nId == IDOK )
-            DuiLibDiag::LogKey(_T("[DLGWP] COMMAND id=%u hi=0x%04X hwnd=%p"),
-                nId, (unsigned)HIWORD(wParam), hWnd);
-    }
 
     if( uMsg == WM_GETDLGCODE )
         return DLGC_WANTALLKEYS;

+ 0 - 45
DuiLib/Utils/UIDiag.cpp

@@ -104,51 +104,6 @@ namespace DuiLibDiag
 		}
 	}
 
-	// ★【R49d】键盘追踪开关:与 Enabled() 独立。要彻底关掉键盘追踪就把它改回 false。
-	inline bool KeyTraceEnabled()
-	{
-		return true;
-	}
-
-	// 与 Log() 同构,只换文件名与开关;逻辑一字不改(上限改成 4MB,
-	// 因为它只记录 ESC / 回车 / Tab,正常一天也就几十到几百行)。
-	void LogKey(LPCTSTR fmt, ...)
-	{
-		if (!KeyTraceEnabled()) return;
-
-		TCHAR path[MAX_PATH] = { 0 };
-		::GetModuleFileName(NULL, path, MAX_PATH);
-		TCHAR* p = _tcsrchr(path, _T('\\'));
-		if (p != NULL) *(p + 1) = _T('\0');
-		_tcscat_s(path, MAX_PATH, _T("dlgkey_trace.log"));
-
-		TCHAR msg[1024] = { 0 };
-		va_list ap;
-		va_start(ap, fmt);
-		_vsntprintf_s(msg, _countof(msg), _TRUNCATE, fmt, ap);
-		va_end(ap);
-
-		char utf8[2048] = { 0 };
-#ifdef _UNICODE
-		if (::WideCharToMultiByte(CP_UTF8, 0, msg, -1, utf8, (int)sizeof(utf8) - 1, NULL, NULL) <= 0)
-			return;
-#else
-		_tcscpy_s(utf8, _countof(utf8), msg);
-#endif
-
-		FILE* f = NULL;
-		WIN32_FILE_ATTRIBUTE_DATA fad = { 0 };
-		if (::GetFileAttributesEx(path, GetFileExInfoStandard, &fad)
-			&& fad.nFileSizeHigh == 0 && fad.nFileSizeLow >= (4u * 1024u * 1024u))
-			return;
-		if (fopen_s(&f, Narrow(path), "a") == 0 && f != NULL)
-		{
-			fprintf(f, "[%8u][T%5u] %s\n", (unsigned)::GetTickCount(), (unsigned)::GetCurrentThreadId(), utf8);
-			fflush(f);
-			fclose(f);
-		}
-	}
-
 	void LogButtonActivate(LPCTSTR name, bool captureState, unsigned buttonState, bool pushed)
 	{
 		// 位域含义(取自 UIManager.h 的 #define,勿凭记忆写):

+ 0 - 9
DuiLib/Utils/UIDiag.h

@@ -29,15 +29,6 @@ namespace DuiLibDiag
 	// 写 exe 同目录 touch_trace.log。
 	void Log(LPCTSTR fmt, ...);
 
-	// 【R49d · 临时诊断】键盘"谁收到了"追踪专用通道。
-	//
-	// 与 Log() 的区别:
-	//   · **不受 Enabled() 开关控制** —— 由 UIDiag.cpp 里的 kKeyTrace 独立开关(默认开);
-	//   · 写**另一个文件** dlgkey_trace.log(与 touch_trace.log 分开,便于单独回传);
-	//   · 只被极少量调用点使用(真模态弹框的键盘 / 命令消息),量极小,长期开着也无妨。
-	// 问题定位后连同调用点一起删除。
-	void LogKey(LPCTSTR fmt, ...);
-
 	// 按钮被激活时的现场快照。用途:
 	//   · 定位"弹框刚出来就被自动点掉"——会看到弹框内的按钮在弹框创建后
 	//     极短时间内被激活,且 mgrCaptured=0;