2017-10-18 5 views
1

J'utilise VS2017 et j'ai créé un «lanceur» très simple pour divers fichiers de paramètres RDP à l'aide d'une application Windows Forms. Cela appelle simplement Process.Start avec un lien direct vers un fichier .rdp, ou directement vers mstsc.exeRDP/MSTSC Ignore le correctif manifeste highdpi lorsqu'il est lancé à partir de l'application de formulaire Windows

L'application (et les sessions RDP) s'affiche et fonctionne correctement sur les PC standard. Cependant, j'ai rencontré un problème sur des périphériques à haute résolution tels que Surface Books/pros.

Le client RDP n'est pas mis à l'échelle correctement est un problème assez bien connu, et nous avons résolu ce problème à l'aide de la méthode de modification manifeste/reg. Ceci est confirmé travailler. Double-cliquer sur un fichier de configuration .rdp fonctionne correctement aussi.

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

Mon propre application affiche également correctement à la bonne échelle. Toutefois, lorsque je lance RDP à l'aide de Process.Start, le client RDP est mal dimensionné, comme il l'était avant le correctif manifeste. J'ai essayé d'ouvrir le client seul, et avec un fichier .rdp et le résultat est le même. J'ouvre le même fichier .rdp manuellement, pas via mon application, et le client est mis à l'échelle correctement.

Quelqu'un peut-il répliquer ceci, ou conseiller pourquoi le fichier manifeste mstsc est ignoré au démarrage de cette façon? J'ai également essayé l'utilisation de ProcessStartInfo pour définir UseShellExecute mais toujours le même résultat.

+1

Ma boule de cristal indique que votre application Winforms a le forçage de la gigue activé et fonctionne donc comme un processus 32 bits. Donc, va démarrer c: \ windows \ syswow64 \ mstsc.exe, celui que vous n'avez pas piraté. Ce hack PreferExternalManifest est gawdawful btw, rien de tel que les dommages que vous pouvez faire avec une solution globale à un problème localisé. La vue 32 bits de la clé de Registre se trouve dans Wow6432Node. Supprimez le forçage de la gigue avec Project> Properties> Build. –

+0

Salut Hans, Pouvez-vous mettre votre commentaire comme réponse, afin que je puisse le marquer comme tel, puisqu'il a résolu mon problème! Merci beaucoup. En ce qui concerne le hack PreferExternalManifest - je suis d'accord, mais je ne suis pas au courant d'une solution plus spécifique? Merci encore! Mark –

+0

Si seulement je savais comment se débarrasser de cette horreur. Ne demandez à superuser.com. Si vous êtes à l'aise avec cela, postez simplement la réponse vous-même. –

Répondre

0

Les applications de bureau Windows, telles que RDP, peuvent spécifier un mode de mise à l'échelle DPI («mode de prise de conscience DPI») via un paramètre manifeste ou via des appels d'API lors de l'initialisation. Les applications se comporteront différemment chaque fois que le facteur d'échelle de l'affichage sur lequel elles sont affichées change. Vous pouvez lire plus à ce sujet here. Je spéculerais (je n'ai pas essayé cela pour confirmer cette spéculation) que le processus RDP utilise un manifeste pour déclarer sa connaissance de DPI (selon Per Monitor PPP) et que lorsque vous lancez un processus à travers Processus: Commencez-vous à faire en sorte que la sensibilité DPI de l'application soit modifiée ... peut-être à la connaissance du DPI du processus d'appel? J'utiliserais l'Explorateur de processus système interne pour déterminer la sensibilité DPI de l'application RDP lorsqu'elle s'exécute comme prévu, puis la comparerai à la sensibilité DPI de l'application RDP lorsqu'elle est lancée à partir de votre application. Si c'est le cas, regardez si vous pouvez spécifier la sensibilité DPI du processus que vous voulez démarrer dans Process.Start. Une autre chose que vous pouvez essayer est de définir la sensibilité DPI de votre application WinForms à la même sensibilité DPI de l'application RDP (par moniteur) pour voir si cela aide.

En outre, je suppose que vous exécutez un système d'exploitation> 8.1 en tant que support par moniteur a été introduit en 8.1.