From 198139648d7f71dca004334d35209226585b91f9 Mon Sep 17 00:00:00 2001 From: "Logan.Li" Date: Sun, 26 Jul 2026 17:26:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DRDP=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=8C=96=E7=94=BB=E9=9D=A2=E6=A8=A1=E7=B3=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 最大化时按浏览器可用尺寸重建RDP会话 - 隔离分辨率切换过程中的旧连接事件 --- frontend/src/components/server/RdpDialog.tsx | 24 +++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/server/RdpDialog.tsx b/frontend/src/components/server/RdpDialog.tsx index 1e0c36b..222e7cb 100644 --- a/frontend/src/components/server/RdpDialog.tsx +++ b/frontend/src/components/server/RdpDialog.tsx @@ -243,8 +243,8 @@ export function RdpDialog({ const token = useUserStore.getState().token || localStorage.getItem("token") || ""; - const { width, height } = calcRdpViewport(false); - // 会话分辨率跟随弹窗可用空间,减少大屏下固定 1024x800 造成的左右黑边。 // Logan.Li + const { width, height } = calcRdpViewport(fullscreen); + // 最大化时按浏览器可用空间重建 RDP 会话,避免把低分辨率画布拉伸后变糊。 // Logan.Li setDisplaySize({ width, height }); setCanvasSize({ width, height }); setStatus(t("server.rdpDialog.creating")); @@ -266,8 +266,11 @@ export function RdpDialog({ ws.binaryType = "arraybuffer"; wsRef.current = ws; - ws.onopen = () => setConnected(true); + ws.onopen = () => { + if (wsRef.current === ws) setConnected(true); + }; ws.onmessage = (event) => { + if (wsRef.current !== ws) return; if (typeof event.data !== "string") { paintQueueRef.current = paintQueueRef.current .catch(() => undefined) @@ -283,8 +286,13 @@ export function RdpDialog({ setStatus(String(event.data || t("server.rdpDialog.unparseableFrame"))); } }; - ws.onerror = () => setStatus(t("server.rdpDialog.connectionError")); + ws.onerror = () => { + if (wsRef.current === ws) + setStatus(t("server.rdpDialog.connectionError")); + }; ws.onclose = () => { + // 忽略切换分辨率时旧连接延迟到达的关闭事件。 // Logan.Li + if (wsRef.current !== ws) return; setConnected(false); setStatus((prev) => prev || t("server.rdpDialog.connectionClosed")); }; @@ -292,13 +300,13 @@ export function RdpDialog({ return () => { flushMouseMove(); ws.close(); - wsRef.current = null; + if (wsRef.current === ws) wsRef.current = null; paintQueueRef.current = Promise.resolve(); setConnected(false); setToolsOpen(false); }; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [open, serverId]); + }, [open, serverId, fullscreen]); const canvasPoint = (event: React.MouseEvent) => { const rect = event.currentTarget.getBoundingClientRect(); @@ -344,7 +352,7 @@ export function RdpDialog({ fullscreen={fullscreen} toolsOpen={toolsOpen} onToolsOpenChange={setToolsOpen} - onToggleFullscreen={() => setFullscreen(!fullscreen)} + onToggleFullscreen={() => setFullscreen((current) => !current)} onClose={() => onOpenChange(false)} remoteClipboard={remoteClipboard} onSyncToRemote={(text) => { @@ -378,7 +386,7 @@ export function RdpDialog({ tabIndex={0} className="max-w-full max-h-full outline-none" style={{ - // 最大化只缩放当前画面,不重连 RDP,避免登录过程闪黑。 // Logan.Li + // 会话分辨率与展示区域保持一致,避免浏览器二次放大画面。 // Logan.Li width: fullscreen ? "100%" : displaySize.width, height: fullscreen ? "100%" : displaySize.height, }}