High-DPI Support in WinForms — Why the UI Blurs or Breaks on 4K Monitors, and Practical Fixes
· Go Komura · WinForms, High DPI, Windows, .NET, C#, .NET Framework, Legacy Maintenance, UI, Technical Consulting
“After switching to a new laptop, the text in our business app looks blurry and hard to read.” “When we connected it to a 4K monitor, the buttons and labels overlapped.” “The report preview only breaks at the client’s 125% setting.” Over the past few years, this kind of inquiry has surged whenever companies replace their PCs. High-resolution displays beyond Full HD, along with 125–200% display scaling, have become standard even on business PCs, and WinForms apps built in the era of 96 DPI / 100% display can no longer be displayed comfortably as-is. Among consultations about maintaining old WinForms apps, this is arguably the single most frequent topic today.
What makes it tricky is that the symptoms look scattered — “blurry,” “broken,” “only part of it is too small.” In reality the causes fall into just a handful of categories, and once you know which symptom maps to which cause, you can figure out both how to fix it and how far to go. This article organizes high-DPI support for WinForms apps (both .NET and .NET Framework), starting from how Windows DPI scaling and DPI awareness modes work, through configuration methods, classic pitfalls, and a staged response strategy — all from a practical, hands-on perspective.
1. The Bottom Line First
- On a high-DPI environment, an old app blurring is not a bug — it’s an OS relief measure (DPI virtualization). Windows has the DPI-unaware app render at 96 DPI and then stretches the resulting bitmap, so the layout doesn’t break, but it does look blurry.1
- Conversely, “sharp but broken” is the opposite situation: the app has declared DPI awareness, but the layout hasn’t kept up. Since blurriness and brokenness have opposite root causes, figure out which one you’re dealing with before attempting a fix.
- The first step toward fixing this is to find out which DPI awareness mode (Unaware / System Aware / Per-Monitor V2) your app is currently running in. Check whether it’s declared via the manifest, app.config, or an API call — or not declared at all.2
- The configuration method differs by generation. For .NET (Core 3.1 through .NET 8), use the project file or
Application.SetHighDpiMode; for .NET Framework 4.7 and later, use app.config; for 4.6 and earlier, going as far as System Aware via the manifest is the realistic ceiling.34 - Always open the designer on a 100% (96 DPI) monitor. Opening and saving a form at 150% rewrites
AutoScaleDimensions, a classic incident that breaks the layout for the entire team.5 - Full support (Per-Monitor V2) takes real effort. A practical, two-stage approach — “System Aware so the primary monitor is sharp” as stage one, and full PMv2 support as stage two — lets you match the investment to the app’s remaining lifespan and its usage environment.
- As a stopgap when in-house fixes aren’t feasible or there isn’t time, it’s worth knowing about the “High DPI settings” override available to end users via the exe’s Properties → Compatibility tab — it makes handling support inquiries considerably easier.6
2. Why Things Blur — How DPI Virtualization Works
Windows display scaling is expressed as a multiplier where 96 DPI equals 100%. 125% = 120 DPI, 150% = 144 DPI, 200% = 192 DPI. On a 27-inch 4K (3840×2160) monitor, using 100% makes text too small, so Windows recommends around 150% by default. In other words, the spread of high-resolution displays directly means the spread of environments running at something other than 96 DPI.
The problem is that many older desktop apps were written under the assumption that “the screen is always 96 DPI.” Coordinates, fonts, and icons are all hard-coded in pixels, so if you render them as-is in a 150% environment, everything ends up looking physically two-thirds its intended size. To handle this, Windows lies to apps that haven’t declared DPI awareness, telling them “the screen is 96 DPI,” and then displays what the app draws — thinking it’s at 96 DPI — as a stretched bitmap. This is DPI virtualization (bitmap stretching).1
With this mechanism in mind, symptoms and causes line up neatly. Use this table for your initial triage.
| Symptom | Cause | State |
|---|---|---|
| Everything is uniformly blurry/fuzzy; layout is not broken | DPI virtualization (the OS is stretching a bitmap) | DPI-unaware (Unaware). Safe but ugly |
| Text is sharp, but controls overlap or get clipped | DPI awareness was declared, but the layout hasn’t kept up | Half-finished DPI support. This is the target for remediation |
| Sharp on the primary monitor, blurry when moved to a secondary monitor | System Aware (DPI fixed to the primary monitor at launch) | Working as designed. Decide whether to move to PMv2 |
| Text size is fine, but icons/images are small or coarse | Bitmap assets remain built for 96 DPI | Image assets not yet updated (Section 6) |
| Only a specific screen or control is broken | Fixed-coordinate layout, custom drawing, third-party controls | Target for individual remediation (Section 6) |
The important point is that an app that is merely “blurry” is not actually broken — the OS’s relief measure is working correctly. Remediation means turning off that relief measure and declaring “I’ll handle scaling myself” (i.e., raising the DPI awareness mode), which means the moment you make that declaration, every layout problem becomes your own responsibility. Consultations like “we tried switching to PMv2 as a quick fix and it got even worse” arise from exactly this structure.
3. Sorting Out DPI Awareness Modes
Apps declare to the OS, per process (more precisely, per top-level window from Windows 10 onward), how far they can handle DPI themselves. There are effectively four modes.16
| Mode | Introduced in | DPI seen by the app | On monitor move / DPI change | Practical position in WinForms |
|---|---|---|---|---|
| Unaware | — | Always 96 | OS stretches a bitmap (blurry) | Default when nothing is declared. Blurry but doesn’t break |
| System Aware | Vista | Fixed to the primary monitor’s DPI at sign-in | OS stretches (blurry) on any monitor other than the primary, or after a change | Usable across all generations. The go-to for a pragmatic fix |
| Per-Monitor (V1) | 8.1 | The DPI of the monitor the window is on | Only a notification to the top-level window; scaling is entirely self-managed | No framework support and little practical value. Don’t choose this |
| Per-Monitor V2 | 10 (1703) | The DPI of the monitor the window is on | Even child windows are notified; the OS auto-scales the non-client area | The go-to for full support. Available in .NET Framework 4.7+ / .NET |
The difference between Per-Monitor V1 and V2 is decisive in practice. V1 is a bare Win32-level mechanism where “you get a notification, but everything else is on you” — there’s no reason to use it from WinForms. V2 has the OS automatically scale the non-client area (title bar, scroll bars, menus, etc.), and the WinForms-side framework support (discussed below) is also built around V2. If you’re going Per-Monitor, V2 is the only real choice.6
There is also a mode called GDI scaling (DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED, Windows 10 1809+). The app itself stays Unaware, but text and shapes drawn via GDI are separately upscaled by the OS at the vector level — an improved form of bitmap stretching.6 Since this can potentially reduce text blurriness without changing a single line of code, it’s worth remembering as a stopgap for apps that can’t be remediated (Section 4.3).
Also worth noting: from Windows 10 1607 onward, there’s Mixed-Mode, which lets different top-level windows within the same process run under different awareness modes simultaneously — for example, “the main screen runs as PMv2 while a dialog that can’t yet be fixed stays Unaware and gets stretched by the OS.” This staged migration is supported at the Win32 level.7 It isn’t something you’d casually use from WinForms, but the underlying design philosophy — “you don’t have to fix every screen at once” — connects directly to the staged strategy in Section 7.
4. Configuration by Generation — Getting It Right
How you declare a DPI awareness mode depends on your app’s generation. Get this wrong and you’ll waste time on “I configured it, but it’s not taking effect,” so I’ll go through this generation by generation.
4.1 WinForms on .NET (Core 3.1 through .NET 8)
.NET provides Application.SetHighDpiMode, and the template-generated ApplicationConfiguration.Initialize() (.NET 6 and later) calls it for you. The default is SystemAware.3 The recommended way to configure this is via the project file, which the Visual Studio designer also reads.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<!-- SystemAware (default) / PerMonitorV2 / DpiUnaware / DpiUnawareGdiScaled -->
<ApplicationHighDpiMode>PerMonitorV2</ApplicationHighDpiMode>
</PropertyGroup>
</Project>
One caveat: the project file’s ApplicationHighDpiMode and ApplicationConfiguration.Initialize() are mechanisms introduced in .NET 6.3 In .NET Core 3.1 / .NET 5 projects, setting this property has no effect, so instead call Application.SetHighDpiMode directly in code as shown below (the same applies if you’re using an older-style Main that doesn’t call ApplicationConfiguration.Initialize()). In either case, you must call it before creating even a single window.
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
.NET 6 and later have improved scaling of container controls and MDI child windows under PMv2, resolving many of the problems that existed through .NET 5 — such as controls shifting out of place when a window moves from a 200% monitor to a 100% monitor.3 If you’re going to put in serious effort toward PMv2 support, .NET is clearly an easier fight than .NET Framework, in my experience. For material on whether to migrate off .NET Framework, see “Pre-Migration Checklist: .NET Framework to .NET.”
4.2 .NET Framework 4.7 and Later
.NET Framework significantly strengthened high-DPI support in 4.7 — improved control scaling, DPI-change events (the DpiChanged family), the DeviceDpi property, and more. However, it’s opt-in: it only takes effect once you set the following two things together.4
First, declare Windows 10 compatibility in the manifest (without this, the 4.7 high-DPI features themselves aren’t enabled).
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 compatibility declaration -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Next, declare the DPI awareness mode in System.Windows.Forms.ApplicationConfigurationSection in app.config.
<configuration>
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
<!-- If some screens already handle their own scaling, you can turn off individual features -->
<!-- <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" /> -->
</System.Windows.Forms.ApplicationConfigurationSection>
</configuration>
Also confirm that Application.EnableVisualStyles() is called at the start of Main. There’s one caution here: the older approach of writing <dpiAware> / <dpiAwareness> in the manifest overrides the app.config setting, so official guidance recommends against using both together in 4.7 WinForms.4 When upgrading an app that previously had <dpiAware>true</dpiAware> written into the manifest for System Aware to 4.7+PMv2, start by cleaning up that manifest declaration. “I set it in app.config, but it’s not taking effect” is almost always caused by this.
4.3 .NET Framework 4.6 and Earlier, and VB6/MFC Mixed Codebases
WinForms in 4.6 and earlier has no framework code that supports PMv2, so forcing the declaration means you have to handle every bit of layout breakage yourself. The realistic ceiling for this generation is declaring System Aware via the manifest. The manifest is the recommended mechanism for OS-level declarations; writing both <dpiAware> (Vista onward) and <dpiAwareness> (Windows 10 1607 onward) together ensures it’s interpreted as intended on both older and newer OS versions.2
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">system</dpiAwareness>
</asmv3:windowsSettings>
</asmv3:application>
With System Aware, WinForms’ automatic scaling (Section 5) kicks in once, matching the primary monitor’s DPI at launch, so the display looks sharp on the primary monitor. If a form has AutoScaleMode.Font set correctly, this declaration alone often gets you to a fairly presentable state. Note that there’s also a way to declare this at runtime via APIs like SetProcessDpiAwareness, but it can’t be changed after window creation, and manifest declaration is the officially recommended approach.8 The same thinking applies to apps mixing VB6 or MFC code — the exe’s manifest determines the mode for the entire process (MFC itself has no automatic-scaling support, so a screen-by-screen check after declaring System Aware is essential; for handling legacy assets of this generation, also see “What Is MFC on Windows”).
I’ll also introduce a stopgap on the user’s side for when remediation itself isn’t possible: right-click the exe → Properties → Compatibility tab → “Change high DPI settings,” which lets you override that app’s DPI scaling behavior. Setting “Override high DPI scaling behavior” to “System” forces DPI virtualization (doesn’t break, but blurs); setting it to “System (Enhanced)” applies the GDI scaling mentioned in Section 3, making only GDI-rendered text sharp.6 It’s not a cure-all, but it’s worth including in your support playbook as something you can walk a customer through over the phone when they need a fix “right now.”
5. AutoScaleMode and the Designer Trap
Separate from the DPI awareness mode, WinForms has its own form-level automatic scaling mechanism. Without understanding this, switching to System Aware won’t scale things correctly.
Here’s how it works. At design time, each form (ContainerControl) records the scaling basis in AutoScaleMode, and records the baseline value from the environment it was designed in, in AutoScaleDimensions. At run time, it compares this against the current environment’s value (CurrentAutoScaleDimensions), and if there’s a difference, it scales all the child controls accordingly.9 In other words, it’s a mechanism for absorbing the “difference between the design-time and run-time environment,” and the baseline value gets baked into the code (Designer.cs).
There are effectively two choices for AutoScaleMode.
| AutoScaleMode | Basis | Characteristics |
|---|---|---|
| Font (recommended, default) | The form’s font dimensions | Since the actual size of the system font changes as DPI rises, this doubles as DPI tracking. Also tracks the user’s font setting changes |
| Dpi | Screen DPI | Scales in proportion to DPI only. Suited for graphics-heavy screens |
| None | — | Automatic scaling disabled. Apps with 96 DPI hard-coded values are often set this way |
When in doubt, use Font. One caveat: it’s officially documented that mixing different modes between a base form and a derived form produces unexpected results.9 For apps that use form inheritance, the first step is an audit to make all forms use the same mode.
And now for the main trap. Since AutoScaleDimensions is a mechanism that records “the value from the environment it was designed in,” if you open the Visual Studio designer on a 150% monitor and save the form, Designer.cs’s AutoScaleDimensions gets rewritten to the 150% value (for Font mode, 6F, 12F becomes 9F, 18F, and so on). Coordinates and sizes also get saved as 1.5x values. When a team member on a 100% environment then builds and runs this form, the whole thing appears shrunk, and a diff review shows a massive diff where every control’s coordinates have changed. “A new team member issued a high-DPI laptop touched one form, and the layout across the whole repository broke” is a classic incident in high-DPI consultations.
The fix, in principle, is a single rule: always open the designer at 100% (96 DPI). Visual Studio itself is a DPI-aware app, but the WinForms designer (for .NET Framework) is not, so opening it on a high-DPI monitor triggers a yellow info bar prompting you to “restart Visual Studio with 100% scaling.”5 Make it team policy to follow this bar, restart in DPI-unaware mode, edit the form, and then switch back to normal mode when finished. You can also launch it that way from the command line via devenv /noScale. Note that for .NET 6+ projects, Visual Studio 2022 17.8 and later lets you set <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware> in the project file, which makes just the designer tab run DPI-unaware without restarting all of VS (this isn’t available for .NET Framework projects).5
As a way to systematize the check, it’s easy and effective to have CI or a pre-commit hook reject diffs where Designer.cs’s AutoScaleDimensions differs from the expected value. It’s cheaper to stop an incident at the commit gate than to fix it after it happens.
6. Common Breakage Patterns and How to Fix Them
When you raise the DPI awareness mode (or are about to), the places that break generally fall into the following patterns.
| What breaks | Cause | Fix |
|---|---|---|
| Controls overlap or get clipped | Fixed-coordinate, fixed-size layout | Replace with Anchor/Dock, TableLayoutPanel / FlowLayoutPanel. Use AutoSize |
| Icons/images are small or coarse | 96-DPI bitmaps pasted directly | Prepare images at multiple resolutions and switch by DPI. Where possible, shrink from one larger source image |
| Custom drawing (charts, diagrams, report previews) | Pixel values hard-coded directly into Graphics | Scale coordinates, line widths, and fonts based on DeviceDpi |
| DataGridView rows are cramped | Pixel-specified RowHeight, etc. | Use AutoSizeRowsMode, or set values scaled by DPI |
| ToolStrip icons are tiny | Fixed 16×16 | Set ImageScalingSize according to DPI |
| Only a specific third-party/ActiveX control is broken | The control itself is DPI-unaware | Update to the vendor’s DPI-aware version. If none exists, that’s the ceiling of what you can achieve |
Replacing layouts is the bulk of the effort. Conversely, screens that were already built with TableLayoutPanel and Dock require very little work even after you raise the DPI awareness mode. Making it a rule that new screens going forward are always built with layout panels from the start reduces future technical debt.
For custom-drawing scaling, the basic approach is to convert values designed at 96 DPI using Control.DeviceDpi (.NET Framework 4.7+ / .NET) as the basis.
public partial class ChartPanel : Panel
{
// Convert a design value based on 96 DPI to the current DPI
private int Scale(int value96) => value96 * DeviceDpi / 96;
protected override void OnPaint(PaintEventArgs e)
{
using var pen = new Pen(Color.Navy, Scale(2));
e.Graphics.DrawRectangle(pen,
Scale(16), Scale(16), Scale(320), Scale(120));
}
// Under PMv2, DPI changes when the window moves between monitors, so trigger a redraw
protected override void OnDpiChangedAfterParent(EventArgs e)
{
base.OnDpiChangedAfterParent(e);
Invalidate();
}
}
Up through System Aware, DPI is fixed at launch, so introducing Scale alone is enough. But under PMv2, DeviceDpi changes every time the window moves between monitors, so you need a design that rebuilds cached fonts, images, and layout values in response to the DpiChanged family of events.4 “How many custom-drawing screens does this app have?” directly drives the effort estimate for PMv2 support.
Third-party controls and ActiveX/OCX are the factor that sets the ceiling for this remediation. If a control itself isn’t DPI-aware, that screen will never be fully fixed no matter how hard the host tries. Check the vendor’s support status, and for ActiveX controls where an update isn’t likely, decide how to handle them using the decision table in “Keep, Wrap, or Replace ActiveX/OCX” before setting your high-DPI support goal.
7. A Staged Response Strategy — A Decision Table for How Far to Go
Given everything above, remediation levels can be organized into three stages. Making every app fully PMv2-compliant is the technical ideal, but given remediation budgets and app lifespans, a pragmatic compromise is often the right call.
| (1) Do nothing (Unaware) | (2) Move to System Aware | (3) Full PMv2 support | |
|---|---|---|---|
| Appearance | Blurry in every environment (doesn’t break) | Sharp on the primary monitor. Blurry on secondary monitors or after a DPI change | Sharp on every monitor |
| Main work | None | Declare via manifest/config + audit AutoScaleMode + verify every screen’s display | (2) + full layout audit + DPI support for custom drawing and image assets + handle DpiChanged |
| Effort | Zero | Small to medium (mainly verification work proportional to screen count) | Large (mostly breakage fixes; third-party controls can cap what’s achievable) |
| Good fit for | Scheduled for retirement within a few years; users tolerate it | In-house apps centered on fixed desktops / a single monitor. As stage one | Mixed laptop + external monitor usage. Long-lived flagship apps. Products distributed to customers |
There are three axes for the decision: the app’s remaining lifespan (how many more years will it be used), the usage environment (if everyone uses the same fixed desktop setup, System Aware is effectively sufficient; if laptop + external monitor combinations are common, System Aware’s blurriness on every monitor move will leave users dissatisfied), and remediation budget. The recommended approach is to first roll out (2) as the standard across all apps, and then use the volume of breakage found in that process, along with the constraints imposed by third-party controls, as the basis for deciding whether — and which screens — to advance to (3). (2) is centered on “declare + verify,” carries low risk of failure, and still meaningfully improves the user’s experience.
A word on testing too. High-DPI issues often don’t reproduce on a developer’s own machine, so deliberately set up the following environments to verify.1
- Connect two monitors with different scaling (e.g., a 150% laptop screen plus a 100% external monitor) and move windows back and forth
- Swap the primary monitor and sign in again before launching (System DPI is fixed at sign-in, so it won’t switch without re-signing in)
- Change the scaling setting while the app is running
- Connect via Remote Desktop from a high-DPI client (RDP brings the client-side DPI along, so “it’s fine on the server console but breaks over RDP” is a common report)
If you get a report that something “only breaks at 125%,” actually reproducing that scaling setting and looking at it is, in my experience, ultimately the fastest way to diagnose it. Since scaling settings can also be changed in a virtual machine, having 100 / 125 / 150 / 200% verification environments ready speeds up triage.
8. Summary
On a high-DPI environment, “blurry” is the OS’s relief measure (DPI virtualization); “broken” is half-finished DPI support — once you have this mapping down, you can work backward from symptom to cause and remedy. Configuration is generation-specific: for .NET, the project file’s ApplicationHighDpiMode; for .NET Framework 4.7 and later, app.config (don’t combine it with the manifest’s dpiAware); for 4.6 and earlier, going as far as System Aware via the manifest. Alongside that, unifying on AutoScaleMode.Font and enforcing the policy of always opening the designer at 100% are unglamorous but do the most to prevent incidents.
From there, how far to go comes down to the three stages in Section 7. Get the primary monitor sharp first via System Aware, then move to PMv2 if the usage environment and the app’s remaining lifespan justify it — this two-stage approach is what we actually recommend on real remediation projects. If the time has come to reconsider the UI framework itself (WPF is designed with strong DPI support from the ground up), also weigh “How to Choose Between WinForms, WPF, and WinUI” as material for that decision. If you’re unsure how far your own app can realistically be fixed, we can help starting from an inventory of your screens and controls.
Related Articles
- How to Choose Between WinForms, WPF, and WinUI — A Decision Table
- Keep, Wrap, or Replace ActiveX/OCX — A Decision Table
- Pre-Migration Checklist: .NET Framework to .NET
- What Is MFC on Windows — What It Is and How to Handle It Today
Related Consulting Areas
Komura Soft LLC handles high-DPI support for legacy WinForms / MFC apps (current-state assessment, deciding the appropriate support level, layout remediation), root-cause investigation of display issues following PC replacements, and consultation on UI modernization.
- Technical Consulting & Design Review
- Legacy Asset Utilization & Migration Support
- Windows App Development
- Contact Us
References
</content>
-
Microsoft Learn, High DPI Desktop Application Development on Windows. Background on DPI scaling, the behavior of each DPI awareness mode, how DPI-unaware apps get bitmap-stretched, and testing considerations for mixed-DPI environments. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Setting the default DPI awareness for a process. How to declare via the manifest’s dpiAware / dpiAwareness elements, their precedence relationship, and why declaring via API is not recommended. ↩ ↩2
-
Microsoft Learn, What’s new in Windows Forms .NET 6. Bootstrapping via ApplicationConfiguration.Initialize, the project file’s ApplicationHighDpiMode setting (default SystemAware), and PerMonitorV2 scaling improvements in .NET 6. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, High DPI support - Windows Forms. The content of .NET Framework 4.7’s high-DPI enhancements, the app.config System.Windows.Forms.ApplicationConfigurationSection (DpiAwareness=PerMonitorV2), why declaring via the manifest is discouraged since it overrides app.config, and the DpiChanged family of events plus DeviceDpi. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Fix DPI display issues in Windows Form Designer. That the WinForms designer is DPI-unaware, the info bar shown on high-DPI monitors prompting a restart at 100% scaling, devenv /noScale, and ForceDesignerDPIUnaware for .NET 6+. ↩ ↩2 ↩3
-
Microsoft Learn, DPI_AWARENESS_CONTEXT handle. Definitions and behavior of the Unaware / System Aware / Per-Monitor / Per-Monitor V2 / UNAWARE_GDISCALED (GDI scaling, Windows 10 1809+) contexts. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Mixed-Mode DPI Scaling and DPI-aware APIs. Mixing DPI awareness modes per top-level window via SetThreadDpiAwarenessContext, and DPI-aware APIs such as GetDpiForWindow. ↩
-
Microsoft Learn, SetProcessDpiAwareness function. Setting a process’s default DPI awareness via API, why manifest declaration is recommended instead, and that it cannot be changed once set. ↩
-
Microsoft Learn, Automatic form scaling - Windows Forms. How automatic scaling behaves via AutoScaleMode / AutoScaleDimensions / CurrentAutoScaleDimensions, and that mixing Font and Dpi modes is unsupported. ↩ ↩2
Related Articles
Recent articles sharing the same tags. Deepen your understanding with closely related topics.
WPF High-DPI Support — Why It Still Blurs and Bleeds Despite Being 'Supposedly DPI-Aware,' and How to Fix It
WPF lays out UI in DIPs (1/96 inch) and is System DPI Aware from the start, but moving a window to a monitor with a different DPI blurs t...
Integrating Entra ID Authentication into WinForms/WPF Apps — A Practical Architecture with MSAL.NET and the WAM Broker
A practical, hands-on look at integrating Entra ID (formerly Azure AD) authentication into WinForms/WPF desktop apps: the public client m...
Date, Time, and Timezones in Business Apps — From DateTime Pitfalls to the UTC-Storage Principle and Test Design
Timestamps drift by nine hours after a server migration; only the overseas office's dates roll back to the previous day — we trace date/t...
Why EXCEL.EXE Processes Remain After C# Excel COM Automation — Reference Release Patterns and the Replacement Decision
A practical look at why EXCEL.EXE processes remain running after automating Excel from C# via Microsoft.Office.Interop.Excel, explained t...
How to Think About Windows Session Isolation — Session 0, RDP, and Running Multiple Users Concurrently
This article untangles the concept of a Windows "session," a topic that consistently confuses Windows app developers. It covers why Sessi...
Related Topics
These topic pages place the article in a broader service and decision context.
Windows Technical Topics
Topic hub for KomuraSoft LLC's Windows development, investigation, and legacy-asset articles.
UI Threading & Timers
Topic page for WPF / WinForms UI threading, async flow, Dispatcher usage, and timer decisions.
Where This Topic Connects
This article connects naturally to the following service pages.
Windows App Development
We support Windows desktop applications that involve resident processing, device integration, operational logging, and maintainable structure.
Author Profile
Profile page for the article author.
Go Komura
Representative of KomuraSoft LLC
Focused on Windows software development, technical consulting, and investigations into failures that are difficult to reproduce.
Public links