Incorrect DPI Scaling in WinForms Custom Control with PerMonitorV2 on Multi-Monitor Setup

Monika Theerthagiri 5 Reputation points
2026-05-11T09:35:40.8433333+00:00

When using a custom WinForms control in a dual‑monitor setup with PerMonitorV2 DPI awareness, the application does not scale correctly based on the monitor where it is launched.

I tested the application in a configuration where primary and secondary monitors use different DPI scaling (175% and 100%, swapped between scenarios). Even when launching the application on the secondary monitor, the rendering appears to follow the primary monitor’s DPI.

Screenshots:
Primary 175%, Secondary 100% – Application Launched on Secondary Monitor
Image (2)

Primary 100%, Secondary 175% – Application Launched on Secondary Monitor
Image (1)

The application builds successfully, but the UI layout and scaling behave incorrectly at runtime:

  • The window is scaled based on the primary monitor instead of the active monitor
  • Moving the window between monitors does not adjust DPI correctly
  • Changing the primary monitor DPI affects rendering on the secondary monitor
  1. Is this expected behavior when using PerMonitorV2 DPI awareness in WinForms?
  2. Is this a known limitation of WinForms or custom controls under .NET Framework?
  3. Or is this a potential issue?
Developer technologies | Windows Forms

3 answers

Sort by: Most helpful
  1. Danny Nguyen (WICLOUD CORPORATION) 7,345 Reputation points Microsoft External Staff Moderator
    2026-05-12T08:50:19.8733333+00:00

    Hi @Monika Theerthagiri

    Thanks for the clarification. Since your scenario is on WinForms with .NET Framework, this is a known limitation, not a new issue.

    This is addressed here:

    https://github.com/dotnet/winforms/issues/10711

    As mentioned in that issue, WinForms does not fully support PerMonitorV2 in .NET Framework. The team also noted that PerMonitorV2 support was still being worked on in .NET, which is why this works better there than in .NET Framework.

    So the behavior you are seeing — scaling based on the primary monitor, incorrect initial DPI on a secondary monitor, and inconsistent updates when moving between monitors — is in line with that limitation.

    If possible, the recommended path is to move to modern .NET, where WinForms DPI support is better.

    Was this answer helpful?


  2. Monika Theerthagiri 5 Reputation points
    2026-05-12T05:46:34.85+00:00

    Thank you for your update regarding the behavior in .NET 10.

    We would like to clarify that the issue we reported is reproducible specifically in applications targeting the .NET Framework (WinForms) and does not appear in modern .NET (such as .NET 6/7/10), as you mentioned.

    In our testing with PerMonitorV2 DPI awareness enabled, the .NET Framework WinForms application exhibits the following behavior:

    • The application scales based on the primary monitor DPI, even when launched on a secondary monitor with a different DPI setting.
    • Initial window rendering does not respect the DPI of the monitor where the application is opened.
    • Moving the window between monitors does not consistently trigger proper DPI recalculation or layout adjustment.
    • Changing the primary monitor’s DPI affects rendering on other monitors, indicating that system DPI is being prioritized over per-monitor DPI at runtime.

    Based on our observations, this appears to be a limitation of WinForms under the .NET Framework, where full PerMonitorV2 DPI behavior is not completely supported especially in scenarios involving custom controls and multi-monitor environments with mixed DPI settings.

    Therefore, we consider this behavior to be expected/known limitation in .NET Framework, rather than a regression or new issue.

    Please let us know if any additional information or reproducible details are required.

    Was this answer helpful?

    0 comments No comments

  3. AI answer

    2026-05-11T09:36:03.47+00:00

    Per‑monitor DPI awareness (including PerMonitorV2) is designed so that:

    • The application sees the DPI of the display that the window is primarily located on.
    • Windows does not bitmap‑scale the UI; instead it sends DPI‑change notifications and the app is responsible for laying out and redrawing correctly.

    From the documentation:

    • System‑DPI‑aware apps use the primary monitor’s DPI for their entire lifetime and are bitmap‑scaled when moved to a monitor with a different DPI.
    • Per‑monitor / Per‑monitor v2 apps are expected to redraw themselves when the DPI changes; Windows sends DPI notifications to the top‑level window (PMv1) and to both top‑level and child windows (PMv2) and never bitmap‑scales the app.

    Given that behavior:

    1. The window using the primary monitor’s DPI regardless of where it is launched, and not updating when moved between monitors, is not expected behavior for a correctly implemented PerMonitorV2 WinForms app. It matches the behavior of a System‑DPI‑aware or DPI‑unaware app.
    2. The platform does not state a limitation that PerMonitorV2 must follow the primary monitor’s DPI or ignore DPI changes. Instead, it states that in PMv2 the app sees the DPI of the display it is on and receives DPI‑change notifications for both top‑level and child HWNDs. WinForms and custom controls must handle those notifications and rescale appropriately; if they do not, the UI will appear too small or too large when moved between monitors.
    3. If the app is correctly registered as PerMonitorV2 but still behaves as described, this indicates a potential issue in how DPI awareness is configured or how the control/form responds to DPI‑change notifications, rather than an intentional limitation of PerMonitorV2.

    References:

    AI-generated content may be incorrect. Read our transparency notes for more information.

    Was this answer helpful?

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.