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.
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.
- DPI awareness detection — reads
PER_MONITOR_DPI_AWARE,SYSTEM_DPI_AWAREorUNAWAREviashcore.dll(Windows 8.1+), with automatic fallback toIsProcessDPIAwareon 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 core —
DX.DisplayInfo.pashas no VCL or FMX dependency; use it in any Delphi project - VCL diagnostic UI — standalone
DisplayInfoUI.exewith live ruler rendering - CLI tool —
DisplayInfoCLI.exefor scripting, CI pipelines or remote diagnostics
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
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.
- 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)
- Open
DisplayInfo.groupprojin the IDE. - Right-click the project group → Build All.
- Compiled executables land in
build\Win32\Debug\.
.\build\DelphiBuildDPROJ.ps1 -ProjectFile src\DisplayInfoCLI.dproj
.\build\DelphiBuildDPROJ.ps1 -ProjectFile src\DisplayInfoUI.dprojAdd 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));| 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 |
| 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 |
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)
| 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.
MIT License — Copyright © 2026 Olaf Monien. See LICENSE for the full text.
