UI Otomasyon ve Ekran Ölçeklendirme
Not
Bu belgeler, ad alanında tanımlanan yönetilen UI Otomasyonu sınıflarını kullanmak isteyen .NET Framework geliştiricilerine System.Windows.Automation yöneliktir. UI Otomasyonu hakkında en son bilgiler için bkz. Windows Otomasyonu API'si: UI Otomasyonu.
Windows Vista'dan başlayarak, Windows kullanıcıların inç başına nokta (dpi) ayarını değiştirerek ekrandaki kullanıcı arabirimi (UI) öğelerinin çoğunun daha büyük görünmesini sağlar. Bu özellik uzun süredir Windows'ta kullanılabilse de, önceki sürümlerde ölçeklendirmenin uygulamalar tarafından uygulanması gerekiyordu. Windows Vista'dan başlayarak, Masaüstü Pencere Yöneticisi kendi ölçeklendirmesini işlemeyen tüm uygulamalar için varsayılan ölçeklendirme gerçekleştirir. UI Otomasyonu istemci uygulamalarının bu özelliği hesaba katması gerekir.
Windows Vista'da ölçeklendirme
Varsayılan dpi ayarı 96'dır ve bu da 96 pikselin bir nota inç genişliğinde veya yüksekliğinde yer kapladığı anlamına gelir. Bir "inç"in tam ölçüsü, monitörün boyutuna ve fiziksel çözünürlüğüne bağlıdır. Örneğin, 12 inç genişliğindeki bir monitörde, 1280 piksellik yatay çözünürlükte, 96 piksellik yatay çizgi bir inçin yaklaşık 9/10'unda uzanır.
Dpi ayarını değiştirmek, ekran çözünürlüğünü değiştirmekle aynı değildir. Dpi ölçeklendirme ile ekrandaki fiziksel piksel sayısı aynı kalır. Ancak ölçeklendirme, kullanıcı arabirimi öğelerinin boyutuna ve konumuna uygulanır. Bu ölçeklendirme, masaüstü için Masaüstü Pencere Yöneticisi (DWM) tarafından ve açıkça ölçeklendirilmemesi istenmeyen uygulamalar için otomatik olarak gerçekleştirilebilir.
Kullanıcı ölçek faktörünü 120 dpi olarak belirlediğinde ekranda dikey veya yatay bir inç yüzde 25 büyür. Tüm boyutlar buna göre ölçeklendirilir. Bir uygulama penceresinin ekranın üst ve sol kenarlarından uzaklığı yüzde 25 artar. Uygulama ölçeklendirme etkinse ve uygulama dpi algılamalı değilse, pencerenin boyutu, içerdiği tüm kullanıcı arabirimi öğelerinin uzaklıkları ve boyutlarıyla birlikte aynı oranda artar.
Not
Varsayılan olarak, kullanıcı dpi'yi 120 olarak ayarladığında DWM, dpi algılamalı olmayan uygulamalar için ölçeklendirme gerçekleştirmez, ancak dpi 144 veya daha yüksek bir özel değere ayarlandığında bunu gerçekleştirir. Ancak, kullanıcı varsayılan davranışı geçersiz kılabilir.
Ekran ölçeklendirme, ekran koordinatlarıyla herhangi bir şekilde ilgilenen uygulamalar için yeni zorluklar oluşturur. Ekranda artık iki koordinat sistemi vardır: fiziksel ve mantıksal. Bir noktanın fiziksel koordinatları, kaynağın sol üst köşesinden piksel cinsinden gerçek uzaklıktır. Mantıksal koordinatlar, piksellerin kendileri ölçeklendirildiyse olduğu gibi uzaklıklardır.
Koordinatlarda bir düğme (100, 48) bulunan bir iletişim kutusu tasarladığınız varsayıldığında. Bu iletişim kutusu varsayılan 96 dpi'de görüntülendiğinde, düğme (100, 48) fiziksel koordinatlarında bulunur. 120 dpi'de fiziksel koordinatlarında bulunur (125, 60). Ancak mantıksal koordinatlar herhangi bir dpi ayarında aynıdır: (100, 48).
Mantıksal koordinatlar önemlidir çünkü işletim sisteminin ve uygulamaların davranışını dpi ayarından bağımsız olarak tutarlı hale getirir. Örneğin, Cursor.Position normalde mantıksal koordinatları döndürür. İmleci iletişim kutusundaki bir öğenin üzerine taşırsanız, dpi ayarından bağımsız olarak aynı koordinatlar döndürülür. (100, 100) konumunda bir denetim çizerseniz, bu mantıksal koordinatlara çizilir ve herhangi bir dpi ayarında aynı göreli konumu kaplar.
UI Otomasyonu İstemcilerinde Ölçeklendirme
UI Otomasyonu API'sinde mantıksal koordinatlar kullanılmaz. Aşağıdaki yöntemler ve özellikler fiziksel koordinatlar döndürür veya bunları parametre olarak alır.
Varsayılan olarak, 96 dpi olmayan bir ortamda çalışan bir UI Otomasyonu istemci uygulaması bu yöntem ve özelliklerden doğru sonuçları alamaz. Örneğin, imleç konumu mantıksal koordinatlarda olduğundan, istemci imlecin altındaki öğeyi almak için bu koordinatları doğrudan 'a FromPoint geçiremez. Buna ek olarak, uygulama pencereleri istemci alanının dışına doğru yerleştiremeyecektir.
Çözüm iki bölümden oluşur.
İlk olarak, istemci uygulamasını dpi'ye duyarlı hale getirin. Bunu yapmak için başlangıçta Win32 işlevini
SetProcessDPIAware
çağırın. Yönetilen kodda, aşağıdaki bildirim bu işlevi kullanılabilir hale getirir.[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
Bu işlev sürecin tamamını dpi'ye duyarlı hale getirir; başka bir deyişle işleme ait olan tüm pencereler ölçeklendirilmemiş olur. Örneğin Vurgulayıcı Örneğinde, vurgu dikdörtgenini oluşturan dört pencere mantıksal koordinatlardan değil, UI Otomasyonu elde edilen fiziksel koordinatlarda bulunur. Örnek dpi algılamalı değilse, vurgu masaüstündeki mantıksal koordinatlarda çizilir ve bu da 96 dpi olmayan bir ortamda yanlış yerleştirmeye neden olur.
İmleç koordinatlarını almak için Win32 işlevini
GetPhysicalCursorPos
çağırın. Aşağıdaki örnekte bu işlevin nasıl bildirilip kullanılacağı gösterilmektedir.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
Dikkat
kullanmayın Cursor.Position. Bu özelliğin ölçeklendirilmiş bir ortamdaki istemci pencerelerinin dışındaki davranışı tanımlanmamıştır.
Uygulamanız dpi algılamalı olmayan uygulamalarla doğrudan çapraz işlem iletişimi gerçekleştiriyorsa Win32 işlevlerini PhysicalToLogicalPoint
ve LogicalToPhysicalPoint
kullanarak mantıksal ve fiziksel koordinatlar arasında dönüştürme yapmış olabilirsiniz.