Bagikan melalui


Automasi Antarmuka Pengguna dan Penskalaan Layar

Catatan

Dokumentasi ini ditujukan untuk pengembang .NET Framework yang ingin menggunakan kelas UI Automation terkelola yang ditentukan pada namespace System.Windows.Automation. Untuk informasi terbaru tentang UI Automation, lihat API Automasi Windows: Automasi Antarmuka Pengguna.

Dimulai dengan Windows Vista, Windows memungkinkan pengguna untuk mengubah pengaturan titik per inci (dpi) sehingga sebagian besar elemen antarmuka pengguna (UI) di layar tampak lebih besar. Meskipun fitur ini telah lama tersedia di Windows, di versi sebelumnya penskalaan harus diimplementasikan oleh aplikasi. Dimulai dengan Windows Vista, Desktop Window Manager melakukan penskalaan default untuk semua aplikasi yang tidak menangani penskalaan mereka sendiri. Automasi Antarmuka Pengguna aplikasi klien harus mempertimbangkan fitur ini.

Penskalaan di 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 selebar 12 inci, pada resolusi horizontal 1280 piksel, garis horizontal 96 piksel memanjang 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 pada ukuran dan lokasi elemen UI. Penskalaan ini dapat dilakukan secara otomatis oleh Desktop Window Manager (DWM) untuk desktop dan untuk aplikasi yang tidak secara eksplisit meminta untuk tidak diskalakan.

Akibatnya, ketika pengguna menetapkan faktor skala menjadi 120 dpi, inci vertikal atau horizontal di layar menjadi lebih besar sebesar 25 persen. Semua dimensi diskalakan sesuai dengan itu. 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.

Catatan

Secara default, DWM tidak melakukan penskalaan untuk aplikasi non-dpi-aware ketika pengguna menetapkan dpi ke 120, tetapi melakukannya ketika dpi diatur ke nilai kustom 144 atau lebih tinggi. Namun, pengguna dapat mengganti perilaku default.

Penskalaan layar menciptakan tantangan baru untuk aplikasi yang terlibat dengan cara apa pun dengan koordinat layar. Layar sekarang berisi dua sistem koordinat: fisik dan logis. Koordinat fisik suatu titik adalah offset aktual dalam piksel dari kiri atas asal. Koordinat logis adalah offset seperti jika piksel itu sendiri diskalakan.

Misalkan Anda mendesain kotak dialog dengan tombol pada koordinat (100, 48). Ketika kotak dialog ini ditampilkan pada default 96 dpi, tombol terletak pada koordinat fisik (100, 48). Pada 120 dpi, terletak pada koordinat fisik (125, 60). Tetapi koordinat logisnya sama pada pengaturan dpi apa pun: (100, 48).

Koordinat logis penting, karena mereka membuat perilaku sistem operasi dan aplikasi konsisten terlepas dari pengaturan dpi. Misalnya, Cursor.Position biasanya mengembalikan koordinat logis. Jika Anda memindahkan kursor di atas elemen dalam kotak dialog, koordinat yang sama dikembalikan terlepas dari pengaturan dpi. Jika Anda menggambar kontrol pada (100,100), itu ditarik ke koordinat logis tersebut, dan akan menempati posisi relatif yang sama pada pengaturan dpi apa pun.

Penskalaan di Klien Automasi Antarmuka Pengguna

API Automasi Antarmuka Pengguna tidak menggunakan koordinat logis. Metode dan properti berikut mengembalikan koordinat fisik atau menganggapnya sebagai parameter.

Secara default, aplikasi klien Automasi Antarmuka Pengguna 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 hanya 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 dalam dua bagian.

  1. Pertama, membuat aplikasi klien dpi-aware. Untuk melakukan ini, panggil fungsi SetProcessDPIAware Win32 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 Function
    

    Fungsi ini membuat seluruh proses dpi-aware, yang berarti bahwa semua jendela yang termasuk dalam proses tidak berskala. Dalam Sampel Penyorot, misalnya, empat jendela yang membentuk persegi sorotan terletak di koordinat fisik yang diperoleh dari Automasi UI, bukan koordinat logis. Jika sampel tidak sadar dpi, sorotan akan ditarik pada koordinat logis pada desktop, yang akan mengakibatkan penempatan yang salah di lingkungan non-96-dpi.

  2. Untuk mendapatkan koordinat kursor, panggil fungsi Win32 GetPhysicalCursorPos. 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 luar jendela klien dalam lingkungan berskala tidak terdefinisi.

Jika aplikasi Anda melakukan komunikasi lintas proses langsung dengan aplikasi non-dpi-aware, Anda mungkin telah mengonversi antara koordinat logis dan fisik dengan menggunakan fungsi PhysicalToLogicalPoint Win32 dan LogicalToPhysicalPoint.

Lihat juga