From 96688166bac82eba2830fc9f57cbe5f0d93ad47d Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 7 Jun 2026 21:04:16 +0200 Subject: [PATCH] Fix: clear residual image outside remote frame in non-adaptive scroll mode --- server/2015Remote/2015RemoteDlg.cpp | 1 + server/2015Remote/ScreenSpyDlg.cpp | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 8a90204..36521a1 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -5818,6 +5818,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) ack.status = CONN_AUTH_CLOCK_SKEW; Mprintf("[ConnAuth] %s: 时钟偏差 %lld 秒,拒绝\n", ContextObject->GetPeerName().c_str(), skew); + PostMessageA(WM_SHOWMESSAGE, (WPARAM)new CharMsg("Connection AUTH failed. Please check the client's time."), NULL); } else { BYTE sigInput[8 + 8 + 16]; memcpy(sigInput, &pkt->clientID, 8); diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index f583491..6d444ba 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -1714,7 +1714,20 @@ void CScreenSpyDlg::OnPaint() StretchBlt(m_hFullDC, 0, 0, dstW, dstH, m_hFullMemDC, 0, 0, srcW, srcH, SRCCOPY); } } else { - BitBlt(m_hFullDC, 0, 0, srcW, srcH, m_hFullMemDC, m_ulHScrollPos, m_ulVScrollPos, SRCCOPY); + // 实际可见的位图像素数 = 位图剩余宽高(去掉滚动偏移后)与窗口的较小值 + int visW = max(0, min(srcW - (int)m_ulHScrollPos, dstW)); + int visH = max(0, min(srcH - (int)m_ulVScrollPos, dstH)); + if (visW > 0 && visH > 0) + BitBlt(m_hFullDC, 0, 0, visW, visH, m_hFullMemDC, m_ulHScrollPos, m_ulVScrollPos, SRCCOPY); + // 位图未覆盖的区域(远程分辨率小于窗口 / 滚动到边缘)填黑,防止残影 + if (visW < dstW) { + RECT rc = { visW, 0, dstW, dstH }; + FillRect(m_hFullDC, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + } + if (visH < dstH) { + RECT rc = { 0, visH, dstW, dstH }; + FillRect(m_hFullDC, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + } } // 绘制框选矩形(左键放大用红色,右键截图用绿色,二者颜色错开避免误操作) @@ -2177,6 +2190,7 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) } ShowScrollBar(SB_BOTH, !m_bAdaptiveSize); SysMenu->CheckMenuItem(IDM_ADAPTIVE_SIZE, m_bAdaptiveSize ? MF_CHECKED : MF_UNCHECKED); + Invalidate(FALSE); // 立即重绘,清除旧模式的残留画面 break; } case IDM_AUDIO_TOGGLE: {