Skip to content

omonien/DX.DisplayInfo

Repository files navigation

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.

About

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.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors