Explorer'da Yüksek DPI Modu: Değiştiremiyorsanız Çözüm

  • DPI farkındalık modlarını ve bunların keskinlik ve ölçeklemeyi nasıl etkilediğini anlayın.
  • Uygulamaları monitör başına v2'ye yükseltin ve duyarlı düzenlerle WM_DPICHANGED'ı test edin.
  • Uygun olan yerlerde ölçekleme uyumluluğunu/geçersiz kılmayı ve bildirimi kullanın.
  • Sistem ideal seçeneği sunmadığında WorkSpaces ve macOS'ta (SwitchResX) HiDPI'ı etkinleştirir.

yüksek dpi gezgini

Yüksek yoğunluklu ekranlar ve klasik masaüstü uygulamalarının birleşimi bir sürü soruya yol açtı: Explorer neden bulanık, nasıl etkinleştirilir? Yüksek DPI modu Uzak istemcilerde ne Windows'ta Ayarlar menüsü (Windows 11'de DPI, ölçekleme ve çözünürlüğü ayarlama), macOS veya Linux ve geliştiricilerin uygulamalarının ölçeklenebilirliğini ve duyarlılığını korumak için neler yapması gerektiği. Bu makale, en pratik olandan en teknik olana kadar sorunu anlamak ve çözmek için ihtiyacınız olan her şeyi bir araya getiriyor.

Bulanık pencerelerle, 4K monitördeki küçük menülerle nasıl başa çıkacağınızı veya monitörlerde doğru ölçeklemeyi nasıl zorlayacağınızı arıyorsanız ultra geniş 2560×1080 (örneğin, nasıl çözünürlüğü manuel olarak seçin), doğru yerdesiniz. Kullanıcı çözümlerine ek olarak, PPP/DPI farkındalığı (monitör başına, v1 ve v2), bildirim ve uyumluluk ipuçları ve Win32, Windows Forms veya WPF uygulamalarını güncellemeye yönelik özel yönergeler.

Hi-DPI nedir ve bazı uygulamalar neden bulanık görünüyor?

Modern ekranlar çok daha fazlasını yoğunlaştırır inç başına piksel (ppi/dpi) Birkaç yıl öncesine göre (geleneksel 96 DPI'dan 300 DPI ve daha fazlasına). Bir uygulama bu artışa uyum sağlayamadığında, Windows arayüzünü bit eşlemlerle genişletir ve bu da tipik bulanıklık efekti Ölçekleme sırasında; Windows 11'de şu gibi özellikler bile var Otomatik Süper Çözünürlük Görünümü iyileştirmeye çalışanlar.

Microsoft terminolojisinde, bir uygulama farkında olmayan, sistem farkında olan veya monitör başına farkında olan olabilir. Her profil, sistemin otomatik olarak ölçeklenir veya yeni ölçekleme faktörüyle yeniden çizilmesi gerekip gerekmediği. DPI hassasiyeti ne kadar yüksekse, pencereyi farklı ölçeklemelere sahip monitörler arasında taşırken sonuç o kadar keskin olur.

yüksek dpi

Dosya Gezgini ve bulanık sistem uygulamaları durumu

Birçok kullanıcı C:\Windows\explorer.exe klasöründeki sekmenin görünmemesiyle karşılaşıyor. UygunlukExplorer özel olarak işlenmiş bir sistem bileşenidir, bu nedenle alışıldık "DPI ölçekleme davranışını geçersiz kıl" panelini burada göremezsiniz. Bulanık bir Explorer veya Denetim Masası görüyorsanız, sorun genellikle sistem ölçekleme (nasıl olduğunu görün ekran çözünürlüğünü değiştirin ve ayarlayın) arayüzün uyarlanmamış kısımlarında.

Genel olarak bulanık uygulamalarla başa çıkmak için Windows 10/11, "Windows'un uygulamaları bulanık olmayacak şekilde düzeltmesine izin ver" ve uygulama başına ölçeklendirme geçersiz kılma gibi seçenekler sunar. kâşif uyumluluk sekmesi yoksa, bu sistem özellikleri genel davranışı iyileştirebilir, diğer uygulamalar için ise özelliklerinden belirli ölçeklendirme geçersiz kılmalarını uygulayabilirsiniz.

Windows'ta DPI farkındalık modları

Windows ekosisteminde, bir uygulamanın ölçeklendirmeyi nasıl ele aldığına dair net bir sınıflandırma vardır. Bunu anlamak, bir pencerenin neden monitörde keskin göründüğünü ancak bulanık farklı bir ölçek faktörüne sahip başka bir yerde.

Kip . PPP bunu nasıl görüyor? DPI değiştirilirken davranış
Bilinçli değil N / D Her zaman 96 PPP (%100) Bitmap ölçekleme (bulanık)
Sistem Farkındalığı Windows Vista Tek bir DPI: Oturum açarken birincil monitörün DPI'ı Sadece o DPI'da keskin görünüyor; monitörleri/ölçekleri değiştirirseniz, Windows bitmap'i büyüt (bulanık)
Monitör başına (v1) , Windows 8.1 Pencerenin öncelikli olarak bulunduğu monitörün DPI'ı Üst düzey HWND şunları alır: WM_DPICHANGED; kullanıcı arayüzü öğelerinin otomatik ölçeklenmesi yoktur
Monitör başına v2 , Windows 10 1703 Pencere başına etkin monitörün DPI'ı Üst düzey ve ikincil HWND'ler bildirim alır; Windows istemci dışı alanı ölçeklendirir, diyaloglar ve temalar comctl32 V6'dan otomatik olarak

Per-monitor v2'de, uygulama sistem tarafından hiçbir zaman yükseltilmez ve yeniden boyutlandır/yeniden çiz WM_DPICHANGED sonrasındaki içeriklerini kaydeder. Karşılığında Windows, istemci dışı (başlık, kaydırma çubukları), Win32 iletişim kutuları ve "temalı" belirli denetimler üzerindeki çalışmanızı kaydeder.

Mevcut bir uygulamayı güncelleyerek daha canlı hale getirin

Minimum adım, işlemi şu şekilde işaretlemektir: monitör başına v2 (manifest veya API) ve düzen mantığını başlatmanın dışına taşıyın, böylece DPI değiştiğinde de çalışsın (WM_DPICHANGED). Aynı zamanda, varsayımlarımızı gözden geçirmemiz gerekiyor: yazı tipi boyutlarını ve DPI'ye bağlı değerleri sonsuza dek önbelleğe almayı bırakın; yeniden hesaplamak ölçek değiştiğinde.

Birçok Win32 API'si DPI bağlamını açığa çıkarmaz, bu nedenle sistem DPI'sine göre değerler döndürür. Klasik çağrıları, örneğin DPI uyumlu varyantlarla değiştirmeniz önerilir. GetSystemMetricsForDpi GetSystemMetrics yerine WM_NCCREATE'de EnableNonClientDpiScaling gibi özellikleri uygulayın.

Karma Mod: İş Parçacığı Başına DPI Farkındalığı

Uygulamanız büyükse veya üçüncü taraf kullanıcı arayüzlerini bir arada kullanıyorsa, aşamalı bir yaklaşım benimseyebilirsiniz: Ana pencereyi monitör başına güncelleyin ve ikincil üst düzey pencereleri orijinal modlarında bırakın. Bu nedenle, SetThreadDpiAwarenessContext, DPI farkındalığını, söz konusu bağlam etkinken oluşturulan pencerelerle ilişkilendirir.

Karıştırma modlarının karmaşıklığı artırdığını ve Windows'un ihlal edilmesine izin vermediği kurallar olduğunu unutmayın (örneğin, bir HWND ağacı, ana ve alt bilinçler arasında farklı bilinçleri karıştıramaz). Kuraldan saparsanız, sistem bir DPI modunu sıfırla İşlemin veya yeniden ebeveynleştirme sırasında ERROR_INVALID_STATE gibi hataların döndürülmesi.

Temel testler ve yaygın sorunlar

Farklı ölçeklerdeki monitörler arasında pencereleri taşımayı deneyin, her monitörden başlayın, ölçek faktörünü anında değiştirin ve ardından birincil monitörü değiştirdikten sonra, çıkış yap ve tekrar giriş yap DPI/boyut önbelleğini algılamak için. Yüksek/düşük DPI bilgisayarlardan Uzak Masaüstü test paketleri ekler.

Tipik sorunlar: Önerilen WM_DPICHANGED dikdörtgeninin kullanılmaması; iş parçacığı içinde olmadığında değerlerin sanallaştırılması DPI bağlamı doğru; ve kaynakları manuel olarak yüklemenizi zorlayan DPI bağlamsız API'leri (örneğin, uygun boyutlar için LoadIcon'u LoadImage ile değiştirmek).

4K ekranlarda SSMS: harici bildirim ve ölçekleme geçersiz kılma

SQL Server Management Studio (SSMS) geliştiriliyor, ancak bir süredir destek Yüksek DPI Kısmiydi. İki etkili yol var: harici bir bildirim kullanmak ve Uyumlulukta ölçeklemeyi geçersiz kılmak.

Harici Bildirim: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide kayıt defteri anahtarını oluşturur PreferExternalManifest=1 (DWORD). DPI farkındalığını belirtmek için ssms.exe ile birlikte bir ssms.exe.manifest (UTF‑8) dosyası ekleyin. Yeniden başlatın, UHD 3840×2160 çözünürlükte daha net simgeler ve metinler göreceksiniz.

Ölçekleme Geçersiz Kılma: SSMS kısayolunda, Uyumluluk sekmesinde, "Yüksek DPI ölçekleme davranışını geçersiz kıl” ve “Uygulama”yı seçin. Bu, SSMS'nin monitör başına davranmasını zorlar ve DPI değiştiğinde Windows'un bunu bitmap olarak büyütmesini engeller.

Herhangi bir işlemin DPI farkındalığını denetlemek için Process Explorer (Sysinternals), bir "DPI Farkındalığı" sütunu eklemenize olanak tanır. Bilinmeyen (her zaman sistem tarafından ölçeklendirilir) gibi durumları göreceksiniz. Sistem Farkındalığı veya monitör başına. Bu kontrol, belirli bir uygulamadan ne beklenmesi gerektiğini anlamak için çok faydalıdır.

Koordinat sanallaştırma ve DPI bağlamından bağımsız API'ler

Bir uygulama veya iş parçacığı farkında olmadan veya sistem farkında olarak çalıştığında, Windows 96 DPI'ı "simüle etmek" için değerleri (örneğin ekran boyutları) sanallaştırabilir ve bu da tanılama işlemlerini karmaşıklaştırır. İş parçacığının doğru şekilde çalıştığından emin olun. DPI bağlamı Metrikleri sorgularken veya pencereler oluştururken beklenen ve SetThreadDpiAwarenessContext'i kullandıktan sonra bağlamı geri yükleyen bir özelliktir.

Birçok klasik API, imzalarında HWND/DPI içermez. Örnekler: Simgeleri yüklerken, YükleGörüntü LoadIcon yerine; ölçümler için GetSystemMetricsForDpi; istemci olmayanlar için EnableNonClientDpiScaling kullanın. Bu tür ayarlar, temiz bir kullanıcı arayüzü ile sistemin kendiliğinden kapattığı bir arayüz arasındaki farkı yaratır. bitmap ile ölçekleme.

Önemli bir not: «hidpi.h» Hi-DPI değildir

HID (İnsan Arayüzü Aygıtı) adı verilen bir rutin vardır. HidP_KullanımListesiFarkı Başlığı hidpi.h olan ve "Hi-DPI" ile karışıklığa yol açan bir API'dir. Bu API'nin ekran ölçeklemeyle hiçbir ilgisi yoktur: karşılaştırmak için kullanılır. HID kullanım listeleri (butonlar/girişler) ve önceki ve mevcut durumlar arasındaki farkları elde edin.

İmzası HIDP_STATUS_SUCCESS değerini döndürür ve PreviousUsageList ve CurrentUsageList tamponlarını kullanarak kaybolan kullanımları depolar. BreakKullanımListesi ve MakeUsageList'te görünenler. Bir listedeki sıfır, bir ayırıcı olarak yorumlanır. Bağlam açısından, bu şu kategoriye aittir: HID (klavyeler, gamepad'ler) Hi-DPI ekranların dünyasına değil.

Process Explorer ile hızlı tanılama

Bir uygulamanın nasıl ölçekleneceğinden emin değilseniz, Process Explorer'a "DPI Farkındalığı" sütununu ekleyin. Bilinmiyor (sistem her zaman ölçeklendir), Sistem farkındalığı (ilk DPI değerini alır ve değişikliklere tepki vermez) veya monitör başına. Bu kontrol, bildirime ihtiyacınız olup olmadığına karar vermek için yararlıdır. ölçekleme iptali veya düzen yeniden düzenlemesi.

Hi-DPI'da ustalaşmak, sistem ince ayarlarını (ve uyumluluk seçeneklerini) iyi geliştirme uygulamalarıyla birleştirmek anlamına gelir. Burada ele aldığımız bilgiler sayesinde, bulanık arayüzleri görmeyi bırakabilir, macOS'ta ultra geniş monitörleri gerçek Hi-DPI çözünürlükleriyle ayarlayabilir, yüksek yoğunluklu modu etkinleştirebilirsiniz. Çalışma Alanları ve eğer bir geliştiriciyseniz, uygulamanızı net bir planla monitör başına v2'ye taşıyın: WM_DPICHANGED'a yanıt verin, "DPI için" ölçümlerini kullanın ve gerektiğinde karma moda güvenin.

İlgili makale:
Windows 10'da ekran çözünürlüğü nasıl değiştirilir