|
|
@@ -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;
|