2017-10-18 6 views
1

Ich bin mit VS2017 und habe eine sehr einfache ‚Launcher‘ für verschiedene RDP Einstellungsdateien mit einem Windows Forms-Anwendung gemacht. Dies ruft Process.Start mit einer direkten Verbindung zu einer .rdp-Datei oder alternativ einfach direkt zu mstsc.exe auf.RDP/MSTSC Ignoriert highdpi Manifest fix, wenn aus den Fenstern gestartete Anwendung bildet

Die Anwendung (und RDP-Sitzungen) angezeigt und funktioniert ordnungsgemäß auf Standard-PCs. Allerdings habe ich ein Problem mit High-DPI-Geräten wie Surface Books/Pros.

Der RDP-Client nicht korrekt ist Skalierung ein recht gut bekanntes Problem, und wir haben dieses Problem mit den Manifest/reg Änderungsverfahren festgelegt. Dies funktioniert bestätigt. Ein Doppelklick auf eine RDP-Konfigurationsdatei funktioniert ebenfalls.

(https://www.blackforce.co.uk/2016/04/18/remote-desktop-rdp-resolution-on-a-surface-book)

Meine eigene Anwendung zeigt auch korrekt im richtigen Maßstab. Wenn ich jedoch RDP mit Process.Start starte, wird der RDP-Client wie immer vor der Manifest-Korrektur schlecht skaliert. Ich habe versucht, den Client allein zu öffnen, und mit einer RDP-Datei und das Ergebnis ist das gleiche. Ich öffne die gleiche RDP-Datei manuell, nicht über meine App, und der Client wird korrekt skaliert.

Kann das jemand replizieren, oder raten, warum die Mstsc Manifest-Datei wird ignoriert, wenn auf diese Weise begonnen? Ich habe auch versucht, mit der Verwendung von ProcessStartInfo UseShellExecute, aber immer noch das gleiche Ergebnis.

+1

Meine Kristallkugel sagt, dass Ihre WinForms-App der Jitter auf so läuft als 32-Bit-Prozess gedreht hat Zwingen. So wird c: \ windows \ syswow64 \ mstsc.exe gestartet, die, die Sie nicht hacken. Dieser PreferExternalManifest-Hack ist übrigens gütig, nichts ist wie der Schaden, den man mit einer globalen Lösung für ein lokalisiertes Problem anrichten kann. Die 32-Bit-Ansicht des Registrierungsschlüssels befindet sich in Wow6432Node. Entfernen Sie das Jitter-Forcen mit Projekt> Eigenschaften> Erstellen. –

+0

Hallo Hans, können Sie Ihren Kommentar als Antwort setzen, so kann ich mich als solche markieren, da es mein Problem gelöst! Danke vielmals. Wie für die PreferExternalManifest-Hack - stimme ich zu, aber ich bin nicht bewusst, eine spezifischere Lösung? Danke noch einmal! Mark –

+0

Wenn ich nur wüsste, wie ich diese Schrecklichkeit loswerden kann. Fragen Sie bei superuser.com. Wenn Sie sich damit auskennen, posten Sie die Antwort einfach selbst. –

Antwort

0

Windows-Desktop-Anwendungen wie RDP, können einen DPI-Skalierungsmodus festlegen („DPI Bewusstsein Modus“) entweder durch eine offensichtliche Einstellung oder über API-Aufrufe während der Initialisierung. Wenn sich der Skalierungsfaktor der angezeigten Anzeige ändert, verhalten sich die Anwendungen unterschiedlich. Sie können mehr darüber lesen here.

Ich würde spekulieren (ich habe dies nicht versucht, diese Spekulation zu bestätigen), dass der RDP-Prozess ein Manifest verwendet, um seine DPI-Bekanntheit zu deklarieren (wie Pro Monitor DPI bewusst) und wenn Sie einen Prozess durch Process.Start, dass die angegebene DPI-Kenntnis der App geändert wird ... möglicherweise, dass DPI den aufrufenden Prozess kennt?

Ich würde System Internals Process Explorer verwenden, um die DPI-Erkennung der RDP-Anwendung zu ermitteln, wenn sie wie erwartet ausgeführt wird, und diese dann mit der DPI-Erkennung der RDP-App beim Starten über Ihre App vergleichen. Wenn dies der Fall ist, schauen Sie, ob Sie die DPI-Kenntnis des Prozesses angeben können, den Sie in Process.Start starten möchten. Eine andere Sache, die Sie versuchen können, ist, die DPI-Kenntnis Ihrer WinForms-App auf dieselbe DPI-Kenntnis der RDP-App (per-Monitor) zu setzen, um zu sehen, ob das hilft.

Außerdem nehme ich an, dass Sie auf einem Betriebssystem> 8.1 laufen, da die Unterstützung für Per-Monitor in 8.1 eingeführt wurde.

Verwandte Themen