feat(rdp): wybór rozdzielczości i skalowania (DPI) sesji w Ustawieniach - #187
Merged
Merged
Conversation
Sesja RDP zawsze dostawała natywne piksele panelu przy skali 100/100, więc na ekranach 4K/HiDPI interfejs zdalnego pulpitu wychodził nieczytelny. Ustawienia → Połączenie → Domyślne RDP dostają dwa pokrętła: - Rozdzielczość sesji: „Dopasuj do okna" (jak dotąd) albo stała wartość z listy; stała jest rozciągana do okna SmartSizingiem i nie zmienia jej pełny ekran. - Skalowanie pulpitu zdalnego (DPI): „Jak ekran lokalny" (domyślnie, tak robi mstsc) albo 100–200%. Jedzie w ulDesktopScaleFactor, więc serwer RYSUJE interfejs większy — bez rozmycia. Gdy host odrzuci skalę, ponawiamy bez niej. Przeliczenia siedzą w Core/RdpDisplay (czyste, testowalne); zapis w Ustawieniach działa na żywo na otwartych sesjach — w kartach i w osobnych oknach. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01G2BeQc7J3e3NosuC3vvoGi
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Co i dlaczego
Sesja RDP zawsze dostawała natywne piksele panelu przy skali
100/100(
UpdateSessionDisplaySettings(..., 100u, 100u)), więc na ekranie 4K/HiDPI zdalny pulpitrenderował się 1:1 przy 100% DPI — ostro, ale tak drobno, że „ciężko cokolwiek wyczytać".
Nie było też żadnego sposobu wybrania rozdzielczości ręcznie.
Ustawienia → Połączenie → Domyślne RDP dostają dwa pokrętła:
stała wartość z listy (1024×768 … 3840×2160). Stała jest raz negocjowana i rozciągana do okna
SmartSizingiem; nie zmienia jej ani zmiana rozmiaru okna, ani pełny ekran.
Trafia w
ulDesktopScaleFactor, więc zdalny Windows rysuje interfejs większy, bez rozmycia(odwrotnie niż SmartSizing). To właściwe lekarstwo na 4K.
Domyślne „jak ekran lokalny" bierze mnożnik DPI okna — dokładnie tak zachowuje się
mstsc,więc na laptopie 150% sesja startuje od razu czytelna. Kto woli gęsty obraz jak dotąd, wybiera 100%.
Zmiany
Core/RdpDisplay.cs(nowe) — czyste, testowalne przeliczenia: parsowanie/format tagówrozdzielczości, normalizacja (parzyste,
[200..8192]), skala efektywna z przycięciem do[100..500]i zaokrągleniem do 5%, stałaDeviceScaleFactor = 100(dozwolone tylko 100/140/180).AppSettings—RdpDesktopWidth/RdpDesktopHeight(0×0 = dopasuj do okna) iRdpScalePercent(0 = jak ekran lokalny). Stare pliki
settings.jsonwczytują się bez migracji.RdpDynamicResolution— honoruje oba ustawienia: stała rozdzielczość omija pomiar panelu iwymusza SmartSizing (także w
ApplyExact, czyli w pełnym ekranie), skala jedzie w każdymDisplay-Update. Gdy host odrzuci skalę (starsze serwery znają tylko 100/100), ponawiamy bez niej —
resize nigdy nie przepada. Nowe
ApplyPreConnect()ustawia rozmiar i DPI jeszcze przedConnect()(DesktopWidth/DesktopHeight+DesktopScaleFactor/DeviceScaleFactorprzezIMsRdpExtendedSettings), żeby pierwsza klatka sesji była już poprawna.ApplyDisplaySettings()— zapis w Ustawieniach renegocjuje otwarte sesje bez ponownego łączenia;wołane dla kart i dla sesji w osobnych oknach (
SessionWindow).ComboTag/ComboSelectTag(odpowiednik
SegTag/SegSetdla ComboBoxa). Wyszukiwarka Ustawień łapie je bez zmian.Testy
tests/RdpManager.Tests/RdpDisplayTests.cs— 40+ przypadków: parsowanie tagów (1920x1080,1920×1080, śmieci → auto), normalizacja nieparzystych i przekroczonych wymiarów, round-tripformat↔parse, przycinanie skali, skala „auto" wg DPI (1.5 → 150%, 1.4999 → 150%, 0/NaN → 100%).
a projekt jest
net8.0-windows, więc lokalnie nie dało się zbudować.przeklikać: stała rozdzielczość + pełny ekran, skala 150% na Server 2016+ i na starszym hoście
(powinien zadziałać fallback do 100%), oraz zmianę ustawienia przy otwartej sesji.
Uwagi
RdpScalePercent = 0sesja dostajeteraz skalę DPI ekranu lokalnego zamiast twardych 100%. Rozdzielczość zostaje bez zmian
(„dopasuj do okna"), więc obraz jest nadal ostry — zmienia się tylko rozmiar UI w sesji.
Kto chce starego wyglądu, wybiera 100%.
DesktopScaleFactorprzed połączeniem ustawiamy późno-wiążąco (InvokeMember), bo wwygenerowanym
MSTSCLibparaget_Property/set_Propertywychodzi jako akcesory właściwości,a tych C# nie pozwala wywołać wprost (CS0571). Całość w
try/catch— starsza kontrolka poprostu dostanie DPI dopiero z Display-Update.
następny krok, jeśli będzie potrzebne.
Generated by Claude Code