Bagikan melalui


Mengatur kesadaran DPI default untuk proses

Aplikasi desktop di Windows dapat berjalan dalam mode kesadaran DPI yang berbeda. Mode ini memungkinkan perilaku penskalaan DPI yang berbeda dan dapat menggunakan ruang koordinat yang berbeda. Untuk informasi selengkapnya tentang kesadaran DPI, lihat Pengembangan Aplikasi Desktop DPI Tinggi di Windows. Penting bahwa Anda secara eksplisit mengatur mode kesadaran DPI default dari proses Anda sehingga menghindari perilaku yang tidak terduga.

Ada dua metode utama untuk menentukan kesadaran DPI default dari suatu proses:

1) melalui pengaturan manifes aplikasi

2) secara terprogram melalui panggilan API

Kami menyarankan agar Anda menentukan proses default kesadaran DPI melalui pengaturan manifes. Saat menentukan default melalui API didukung, tidak disarankan.

Mengatur kesadaran default dengan manifes aplikasi

Ada dua pengaturan manifes yang memungkinkan Anda menentukan mode kesadaran DPI default proses: <dpiAwareness> dan <dpiAware>. <dpiAware> diperkenalkan di Windows Vista dan hanya memungkinkan proses Anda default diatur ke kesadaran sistem. <dpiAwareness> diperkenalkan dalam Windows 10, versi 1607 dan memungkinkan Anda menentukan daftar yang diurutkan dari mode kesadaran DPI proses-default. Ini memungkinkan Anda mengatur mode kesadaran DPI cadangan, yang akan digunakan jika aplikasi Anda dijalankan pada versi Windows tidak dapat mendukung mode kesadaran pertama yang ditentukan. Pada versi Windows yang lebih lama, tag dpiAwareness> yang lebih <baru akan diabaikan. Ini berarti Bahwa Anda dapat menggunakan kedua pengaturan manifes ini untuk mengaktifkan skenario di mana default proses Anda dapat menjadi kesadaran sistem pada versi Windows yang lebih lama saat Per-Monitor pada versi yang lebih besar dari Windows 10, versi 1607. Pada Windows 10, versi 1607, dan aktif, <pengaturan dpiAware> diabaikan jika <elemen dpiAwareness> ada.

Tabel di bawah ini menunjukkan cara menentukan mode kesadaran DPI proses-default yang berbeda menggunakan dua pengaturan manifes:

Memproses mode kesadaran DPI default <pengaturan dpiAware> <pengaturan dpiAwareness> (Windows 10, versi 1607 dan yang lebih baru)
Menyadari

T/A (tidak ada pengaturan dpiAware dalam manifes)

atau

<dpiAware>false</dpiAware>

<dpiAwareness>unaware</dpiAwareness>
Sadar sistem <dpiAware>true</dpiAware> <dpiAwareness>system</dpiAwareness>
Per Monitor <dpiAware>true/pm<dpiAware> <dpi Kesadaran>PerMonitor</dpiAwareness>
Per Monitor V2 Tidak didukung <dpiAwareness>PerMonitorV2</dpiAwareness>

 

Sampel di bawah ini menunjukkan <pengaturan dpiAwareness> dan <dpiAware> yang digunakan dalam file manifes yang sama untuk mengonfigurasi perilaku kesadaran DPI proses-default untuk versi Windows yang berbeda.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
  <asmv3:application>
    <asmv3:windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

Mengatur kesadaran default secara terprogram

Meskipun tidak disarankan, dimungkinkan untuk mengatur kesadaran DPI default secara terprogram. Setelah jendela (HWND) dibuat dalam proses Anda, mengubah mode kesadaran DPI tidak lagi didukung. Jika Anda mengatur mode kesadaran DPI proses-default secara terprogram, Anda harus memanggil API yang sesuai sebelum HWND dibuat.

Ada beberapa API yang memungkinkan Anda menentukan kesadaran DPI default untuk proses Anda. API yang direkomendasikan saat ini adalah SetProcessDpiAwarenessContext, karena API yang lebih lama menawarkan lebih sedikit fungsionalitas.

 

API Versi minimum Windows DPI Tidak Menyadari System DPI Aware Per Monitor DPI Aware
SetProcessDPIAware Windows Vista T/A SetProcessDPIAware() T/A
SetProcessDpiAwareness Windows 8.1 SetProcessDpiAwareness(PROCESS_DPI_UNAWARE) SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
SetProcessDpiAwarenessContext Windows 10, version 1607 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE) SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)

SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)

 

Default proses vs. Default utas

Dokumen ini mengacu pada pengaturan kesadaran DPI default untuk proses Anda. Ini karena Windows 10 memperkenalkan dukungan untuk menjalankan lebih dari satu mode kesadaran DPI dalam satu proses (sebelum Windows 10, seluruh proses harus sesuai dengan satu mode kesadaran DPI). Dukungan untuk menjalankan lebih dari satu mode kesadaran DPI dalam proses disebut sebagai "penskalaan DPI mode campuran". Saat menggunakan penskalaan DPI mode campuran dalam proses Anda, setiap Jendela tingkat atas dapat berjalan dalam mode kesadaran DPI yang mungkin berbeda dari default proses. Kecuali ditentukan secara eksplisit, setiap utas akan default ke default proses saat dibuat. Untuk informasi selengkapnya tentang penskalaan DPI mode campuran, lihat artikel Penskalaan DPI Mixed-Mode .