SkillAgentSearch skills...

DX.DisplayInfo

Delphi library for DPI and display diagnostics — per-monitor DPI, physical DPI, scaling percentage. Includes VCL diagnostic UI with DPI rulers and a CLI tool.

Install / Use

/learn @omonien/DX.DisplayInfo

README

DX.DisplayInfo

License: MIT Delphi Platform Last Commit

A lightweight Delphi library for DPI and display diagnostics on Windows. It exposes per-monitor resolution, effective DPI, physical (raw) DPI, DPI awareness mode and scaling percentage — all without external dependencies.

Two ready-to-run executables are included: a VCL GUI with visual DPI rulers and a CLI for scripting and automation.


Screenshot

DX DisplayInfo VCL UI

The VCL UI shows DPI awareness mode, theme status, per-monitor resolution and DPI values, and two calibrated rulers that let you verify at a glance whether the physical monitor DPI matches what Windows reports to your application.


Features

  • DPI awareness detection — reads PER_MONITOR_DPI_AWARE, SYSTEM_DPI_AWARE or UNAWARE via shcore.dll (Windows 8.1+), with automatic fallback to IsProcessDPIAware on older systems
  • Per-monitor enumeration — iterates all connected monitors and reports device name, resolution, effective DPI, physical (raw) DPI and scaling percentage for each
  • Effective vs. physical DPI rulers — visual comparison of what Windows reports to your app vs. the true panel DPI (useful for detecting HiDPI / Retina screens running inside VMs)
  • Framework-agnostic coreDX.DisplayInfo.pas has no VCL or FMX dependency; use it in any Delphi project
  • VCL diagnostic UI — standalone DisplayInfoUI.exe with live ruler rendering
  • CLI toolDisplayInfoCLI.exe for scripting, CI pipelines or remote diagnostics

Project Structure

DX.DisplayInfo/
├── src/
│   ├── DX.DisplayInfo.pas          # Core library unit (RTL + WinAPI only)
│   ├── DisplayInfoCLI.dpr/.dproj   # Console application
│   ├── DisplayInfoUI.dpr/.dproj    # VCL GUI application
│   ├── DisplayInfoUI.Main.Form.*   # Main form (VCL)
│   └── DPITest.manifest            # Custom DPI manifest (see note below)
├── build/
│   ├── DelphiBuildDPROJ.ps1        # Universal build script
│   └── Win32/Debug/                # Compiled output
├── docs/
│   └── Screenshot.png
├── DisplayInfo.groupproj           # Project group (CLI + UI)
├── LICENSE
└── README.md

Application Manifest and DPI Awareness

The VCL UI project includes a hand-crafted manifest file (src/DPITest.manifest) for demonstration purposes. It declares permonitorv2 DPI awareness and the supported Windows OS versions explicitly.

Why the manual manifest?

Delphi support for High DPI evolved gradually across several releases:

| Delphi version | VCL DPI support | IDE manifest option | |---|---|---| | XE7 and earlier | None | None — manual manifest required (tested, both CLI and UI build and run) | | XE8 | None | Unknown / untested | | 10.0 Seattle – 10.2 Tokyo | Basic Per-Monitor DPI (from 10.2) | Basic Enable High-DPI checkbox in Project Options | | 10.3 Rio and later | Full Per-Monitor v2 | Complete Application > Manifest page with DPI Awareness dropdown |

The IDE manifest page with the full DPI Awareness dropdown (as shown in the screenshot above) was introduced in 10.3 Rio alongside Per-Monitor v2 support in the VCL framework.

In all supported versions, a custom manifest file can still be used instead of the IDE option via Project > Options > Application > Manifest > Use application manifest file, which gives full control over all manifest entries.

The manifest ships with two ready-to-use option blocks:

| Option | dpiAwareness value | Effect | |---|---|---| | 1 (active) | permonitorv2 + true/pm fallback | App handles scaling itself — crisp rendering | | 2 (commented out) | unaware | Windows bitmap-stretches the window — may appear blurry |

To switch options, remove the XML comment markers around the desired <application> block, then do a full Clean + Build so the updated manifest is embedded in the executable.


Getting Started

Prerequisites

  • Delphi XE7 or later (tested with XE7 and Delphi 13 / RAD Studio 12)
  • Windows 8.1 or later for full per-monitor DPI support (Windows Vista+ for basic DPI awareness; physical DPI is unavailable on older systems)

Build with Delphi IDE

  1. Open DisplayInfo.groupproj in the IDE.
  2. Right-click the project group → Build All.
  3. Compiled executables land in build\Win32\Debug\.

Build from the command line

.\build\DelphiBuildDPROJ.ps1 -ProjectFile src\DisplayInfoCLI.dproj
.\build\DelphiBuildDPROJ.ps1 -ProjectFile src\DisplayInfoUI.dproj

Using the Library

Add DX.DisplayInfo.pas to your project (no package or BPL required) and call EnsureDpiAwareness at startup.

uses DX.DisplayInfo;

// Set PER_MONITOR_DPI_AWARE before the first window is created
EnsureDpiAwareness;

// Query DPI info for a specific window handle (0 = desktop / primary monitor)
var LInfo := GetDisplayInfo(Self.Handle);

// Enumerate all connected monitors
var LMonitors := GetAllMonitorsInfo;
for var LEntry in LMonitors do
  Writeln(MonitorEntryToText(LEntry));

Key types

| Type | Description | |---|---| | TMonitorEntry | Resolution, effective DPI, physical DPI and scaling % for one monitor | | TDisplayInfo | System DPI, scaling %, awareness mode and per-monitor DPI for a window | | TDpiAwarenessInfo | Awareness enum value, human-readable text and detection source | | TMonitorDpiInfo | Effective and raw DPI pair from GetDpiForMonitor |

Key routines

| Routine | Description | |---|---| | EnsureDpiAwareness | Sets PER_MONITOR_DPI_AWARE (or legacy fallback) | | GetDisplayInfo(HWND) | Full DPI diagnostics for a given window | | GetAllMonitorsInfo | Array of TMonitorEntry for every connected monitor | | MonitorEntryToText | Formatted text block for one monitor | | AllMonitorsInfoToText | Formatted text block for all monitors | | DisplayInfoToText | Formatted text summary of TDisplayInfo |


CLI Output Example

DPI Awareness:  PER_MONITOR_DPI_AWARE

---
Device:          \\.\DISPLAY1
Primary:         Yes
Resolution:      3584 x 2240 px
Effective DPI:   192 x 192  (200%)
Physical DPI:    267 x 270  (105.1 px/cm)

Understanding Effective vs. Physical DPI

| Scenario | Effective DPI | Physical DPI | Rulers | |---|---|---|---| | Standard 1080p at 100% | 96 | 96 | Equal length | | 4K display at 200% scaling | 192 | 192 | Equal length | | Retina screen inside a VM | 192 | 267 | Physical ruler is longer | | External monitor, scaling > physical | 144 | 110 | Effective ruler is longer |

The two rulers in the VCL UI make the difference immediately visible without any arithmetic.


License

MIT License — Copyright © 2026 Olaf Monien. See LICENSE for the full text.

View on GitHub
GitHub Stars18
CategoryDevelopment
Updated2d ago
Forks1

Languages

Pascal

Security Score

95/100

Audited on Apr 1, 2026

No findings