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 => (

View File

@@ -5,7 +5,7 @@ import { useAuth } from '../context/AuthContext';
const ANN_TYPES = { maintenance: { icon: '🔧', label: 'Wartung', color: '#f59e0b' }, warning: { icon: '⚠️', label: 'Warnung', color: '#ef4444' }, info: { icon: '', label: 'Info', color: '#6366f1' } };
const LATEST_AGENT_VERSION = '2.2.0';
const LATEST_AGENT_VERSION = '2.3.0';
const SEVERITY_LABELS = { critical: 'Kritisch', important: 'Wichtig', moderate: 'Moderat', low: 'Niedrig', all: 'Alle' };
const SEVERITY_COLORS = { critical: '#EF4444', important: '#F59E0B', moderate: '#3B82F6', low: '#6B7280', all: '#0D9488' };
const COMMAND_LABELS = { check_updates: '🔍 Update-Scan', install_updates: '⬇️ Installation', reboot: '🔄 Neustart', upgrade_win11: '🪟 Win 11 Upgrade', update_agent: '⬆️ Agent-Update' };