Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Nota
Dokumentasi ini ditujukan untuk pengembang .NET Framework yang ingin menggunakan kelas Automation UI terkelola yang ditentukan dalam namespace System.Windows.Automation. Untuk informasi terbaru tentang Automasi UI, lihat Windows Automation API: UI Automation.
Dimulai dengan Windows Vista, Windows memungkinkan pengguna mengubah pengaturan titik per inci (dpi) sehingga sebagian besar elemen antarmuka pengguna (UI) pada layar tampak lebih besar. Meskipun fitur ini telah lama tersedia di Windows, dalam versi sebelumnya penskalakan harus diimplementasikan oleh aplikasi. Dimulai dengan Windows Vista, Desktop Window Manager melakukan penskalaan default untuk semua aplikasi yang tidak menangani penskalaan mereka sendiri. Aplikasi klien Automation UI harus mempertimbangkan fitur ini.
Penyesuaian ukuran pada Windows Vista
Pengaturan dpi default adalah 96, yang berarti bahwa 96 piksel menempati lebar atau tinggi satu inci nosional. Ukuran "inci" yang tepat tergantung pada ukuran dan resolusi fisik monitor. Misalnya, pada monitor lebar 12 inci, pada resolusi horizontal 1280 piksel, garis horizontal 96 piksel memperluas sekitar 9/10 inci.
Mengubah pengaturan dpi tidak sama dengan mengubah resolusi layar. Dengan penskalaan dpi, jumlah piksel fisik di layar tetap sama. Namun, penskalaan diterapkan ke ukuran dan lokasi elemen UI. Penskalaan ini dapat dilakukan secara otomatis oleh Desktop Window Manager (DWM) untuk desktop dan aplikasi yang tidak secara eksplisit meminta agar tidak diskalakan.
Akibatnya, ketika pengguna mengatur faktor skala menjadi 120 dpi, inci vertikal atau horizontal pada layar menjadi lebih besar sebesar 25 persen. Semua dimensi diskalakan sesuai proporsi. Offset jendela aplikasi dari tepi atas dan kiri layar meningkat sebesar 25 persen. Jika penskalaan aplikasi diaktifkan dan aplikasi tidak sadar dpi, ukuran jendela meningkat dalam proporsi yang sama, bersama dengan offset dan ukuran semua elemen UI yang dikandungnya.
Nota
Secara default, DWM tidak melakukan penskalaan untuk aplikasi yang tidak sadar dpi ketika pengguna mengatur dpi ke 120, tetapi melakukannya ketika dpi diatur ke nilai kustom 144 atau lebih tinggi. Namun, pengguna dapat mengambil alih perilaku default.
Penskalaan layar menciptakan tantangan baru untuk aplikasi yang berkaitan dengan koordinat layar dalam cara apa pun. Layar sekarang berisi dua sistem koordinat: fisik dan logis. Koordinat fisik dari sebuah titik adalah offset aktual dalam piksel dari titik asal di kiri atas. Koordinat logis adalah offset yang akan terjadi seandainya piksel itu sendiri diperbesar.
Misalkan Anda mendesain kotak dialog dengan tombol pada koordinat (100, 48). Ketika kotak dialog ini ditampilkan di default 96 dpi, tombol terletak pada koordinat fisik (100, 48). Pada 120 dpi, terletak pada koordinat fisik (125, 60). Tetapi koordinat logis sama pada pengaturan dpi apa pun: (100, 48).
Koordinat logis penting, karena membuat perilaku sistem operasi dan aplikasi konsisten terlepas dari pengaturan dpi. Misalnya, Cursor.Position biasanya mengembalikan koordinat logis. Jika Anda memindahkan kursor ke elemen dalam kotak dialog, koordinat yang sama dikembalikan terlepas dari pengaturan dpi. Jika Anda menggambar kontrol pada (100, 100), kontrol tersebut ditarik ke koordinat logis tersebut, dan akan menempati posisi relatif yang sama di pengaturan dpi mana pun.
Penskalaan pada Klien Otomatisasi Antarmuka Pengguna
API Automasi UI tidak menggunakan koordinat logis. Metode dan properti berikut mengembalikan koordinat fisik atau mengambilnya sebagai parameter.
Secara default, aplikasi klien Automation UI yang berjalan di lingkungan non-96- dpi tidak akan dapat memperoleh hasil yang benar dari metode dan properti ini. Misalnya, karena posisi kursor berada dalam koordinat logis, klien tidak dapat meneruskan koordinat ini untuk FromPoint mendapatkan elemen yang berada di bawah kursor. Selain itu, aplikasi tidak akan dapat menempatkan jendela dengan benar di luar area kliennya.
Solusinya ada di dua bagian.
Pertama, buat aplikasi klien dpi-aware. Untuk melakukan ini, panggil fungsi
SetProcessDPIAwareWin32 saat startup. Dalam kode terkelola, deklarasi berikut membuat fungsi ini tersedia.[System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool SetProcessDPIAware();<System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function SetProcessDPIAware() As Boolean End FunctionFungsi ini membuat seluruh proses dapat memahami DPI, yang berarti bahwa semua jendela yang termasuk dalam proses tidak mengalami penskalaan. Dalam Sampel Penyorot, misalnya, empat jendela yang membentuk persegi panjang sorotan terletak di koordinat fisik yang diperoleh dari Automasi UI, bukan koordinat logis. Jika sampel tidak peka terhadap dpi, sorotan akan ditampilkan pada koordinat logis di desktop, yang akan mengakibatkan penempatan yang salah di lingkungan dengan dpi selain 96.
Untuk mendapatkan koordinat kursor, panggil fungsi
GetPhysicalCursorPosWin32 . Contoh berikut menunjukkan cara mendeklarasikan dan menggunakan fungsi ini.public struct CursorPoint { public int X; public int Y; } [System.Runtime.InteropServices.DllImport("user32.dll")] internal static extern bool GetPhysicalCursorPos(ref CursorPoint lpPoint); private bool ShowUsage() { CursorPoint cursorPos = new CursorPoint(); try { return GetPhysicalCursorPos(ref cursorPos); } catch (EntryPointNotFoundException) // Not Windows Vista { return false; } }Structure CursorPoint Public X As Integer Public Y As Integer End Structure <System.Runtime.InteropServices.DllImport("user32.dll")> _ Friend Shared Function GetPhysicalCursorPos(ByRef lpPoint As CursorPoint) As Boolean End Function Private Function ShowUsage() As Boolean Dim cursorPos As New CursorPoint() Try Return GetPhysicalCursorPos(cursorPos) Catch e As EntryPointNotFoundException ' Not Windows Vista Return False End Try End Function
Perhatian
Jangan gunakan Cursor.Position. Perilaku properti ini di lingkungan berskala di luar jendela aplikasi belum ditentukan.
Jika aplikasi Anda melakukan komunikasi lintas proses langsung dengan aplikasi yang tidak mendukung DPI, Anda mungkin harus mengonversi antara koordinat logis dan fisik dengan menggunakan fungsi Win32 PhysicalToLogicalPoint dan LogicalToPhysicalPoint.