diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 1e751ec..8a90204 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -6152,11 +6152,24 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) // 关闭对应客户端的循环快照浮窗(如有)。CloseLoopTip 内部 find 找不到会静默返回。 if (info->clientId != 0) { - CloseLoopTip(info->clientId); - // 清理缩略图相关状态(缓存 + 调度 + 在飞标记)。主机已不在列表,重绘不必要。 - ClearThumbnailCacheEntry(info->clientId); - m_ThumbNextDueTick.erase(info->clientId); - m_ThumbnailPending.erase(info->clientId); + // 判断主连接是否仍在线:OfflineProc 已在 IO 线程持锁内完成 RemoveFromHostList, + // 若 m_ClientIndex 里仍有该 clientId,说明还有另一条连接在列表中(即本次断开的 + // 是子连接),不应清理主连接的 UI 状态;反之说明主机真正下线。 + // 直接查 m_ClientIndex 比依赖 hasLogin 更稳健:不受未来子连接 auth 改造影响。 + bool stillOnline; + { + CLock L(m_cs); + stillOnline = (m_ClientIndex.find(info->clientId) != m_ClientIndex.end()); + } + if (!stillOnline) { + // 主连接真正下线:关循环窗、释放缩略图 HBITMAP、清调度状态。 + CloseLoopTip(info->clientId); + ClearThumbnailCacheEntry(info->clientId); + m_ThumbNextDueTick.erase(info->clientId); + m_ThumbnailPending.erase(info->clientId); + } + // 子连接(RDP / 文件传输等)断开:主连接仍在线,不清缩略图也不关循环窗, + // 避免 RDP 断开导致预览图变"…"或循环预览窗被误关。 } // Close child dialog window