Fix: Remote Desktop — 60fps, Screen-Wechsel live, Consent-Dialog sichtbar (v2.3.0)

- CaptureModeRunner: Thread.Sleep(150) → 16ms (~60fps) + Skip-if-unchanged via Pixel-Hash
- RtcService: rdp_switch_screen Handler — Screen wechseln ohne Consent-Dialog
- RtcService: Fallback bei Consent-Fehler → rdp_denied statt silent capture
- RdpConsentWindow: WindowStyle=ToolWindow + ShowInTaskbar=True (jetzt in Taskleiste sichtbar)
- RemoteDesktopPanel: Screen-Dropdown auch während aktiver Verbindung nutzbar
- Version: 2.2.0 → 2.3.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 09:23:36 +02:00
parent 0b2943087d
commit 99830e25f4
9 changed files with 64 additions and 16 deletions

View File

@@ -61,7 +61,9 @@ export default function RemoteDesktopPanel({ agentId, agentHostname, autoConnect
img.src = 'data:image/jpeg;base64,' + msg.data;
} else if (msg.type === 'rdp_denied') {
setStatus('error');
setError('Zugriff wurde vom Benutzer abgelehnt');
setError(msg.reason === 'consent_spawn_failed'
? 'Consent-Dialog konnte nicht geöffnet werden (schtasks-Fehler)'
: 'Zugriff wurde vom Benutzer abgelehnt');
ws.close();
} else if (msg.type === 'rdp_disconnected') {
setStatus('idle');
@@ -119,8 +121,14 @@ export default function RemoteDesktopPanel({ agentId, agentHostname, autoConnect
{/* Screen-Selektor */}
<select
value={screenIdx}
onChange={e => setScreenIdx(Number(e.target.value))}
disabled={status === 'connected' || status === 'connecting' || status === 'waiting'}
onChange={e => {
const newIdx = Number(e.target.value);
setScreenIdx(newIdx);
if (status === 'connected' && wsRef.current?.readyState === WebSocket.OPEN) {
wsRef.current.send(JSON.stringify({ type: 'rdp_switch_screen', screen: newIdx }));
}
}}
disabled={status === 'connecting' || status === 'waiting'}
style={{ fontSize: 12, padding: '3px 8px', borderRadius: 7, border: '1px solid var(--border-color)', background: 'var(--bg-tertiary)', color: 'var(--text-primary)', cursor: 'pointer', marginLeft: 4 }}
>
{SCREEN_OPTIONS.map(o => (