Megosztás a következőn keresztül:


Felhasználói felület automatizálása és képernyőméretezés

Megjegyzés:

Ez a dokumentáció azoknak a .NET-keretrendszer-fejlesztőknek készült, akik a System.Windows.Automation névtérben definiált felügyelt felhasználói felületi Automation-osztályokat szeretnék használni. A felhasználói felület automatizálásával kapcsolatos legfrissebb információkért lásd Windows Automation API: UI Automation.

A Windows Vista-tól kezdve a Windows lehetővé teszi a felhasználók számára a hüvelykenkénti pontok (dpi) beállítás módosítását, hogy a felhasználói felület (UI) legtöbb eleme nagyobbnak jelenjen meg a képernyőn. Bár ez a funkció már régóta elérhető a Windowsban, a korábbi verziókban a skálázást alkalmazásoknak kellett implementálnia. A Windows Vista-tól kezdve az Asztali ablakkezelő alapértelmezett skálázást végez minden olyan alkalmazás esetében, amely nem kezeli a saját skálázását. A felhasználói felület automation-ügyfélalkalmazásainak figyelembe kell venniük ezt a funkciót.

Skálázás Windows Vista rendszerben

Az alapértelmezett dpi-beállítás 96, ami azt jelenti, hogy 96 képpont egy névleges hüvelyk szélességet vagy magasságot foglal el. A "hüvelyk" pontos mértéke a monitor méretétől és fizikai felbontásától függ. Egy 12 hüvelyk széles monitoron például 1280 képpont vízszintes felbontásban egy 96 képpontból álló vízszintes vonal körülbelül 9/10 hüvelykre terjed ki.

A dpi-beállítás módosítása nem ugyanaz, mint a képernyőfelbontás módosítása. A dpi-méretezéssel a képernyőn lévő fizikai képpontok száma változatlan marad. A skálázás azonban a felhasználói felület elemeinek méretére és helyére vonatkozik. Ezt a skálázást a Desktop Window Manager (DWM) automatikusan végrehajthatja az asztali és az olyan alkalmazások esetében, amelyek kifejezetten nem kérik a méretezést.

Ha a felhasználó 120 dpi-ra állítja a méretezési tényezőt, a képernyőn egy függőleges vagy vízszintes hüvelyk 25 százalékkal nagyobb lesz. Minden dimenzió ennek megfelelően van skálázva. Egy alkalmazásablak eltolása a képernyő felső és bal szélétől 25%-kal nő. Ha az alkalmazás skálázása engedélyezve van, és az alkalmazás nem dpi-kompatibilis, az ablak mérete ugyanabban az arányban nő, valamint az összes felhasználói felületi elem eltolásai és méretei.

Megjegyzés:

Alapértelmezés szerint a DWM nem végez skálázást a nem dpi-vel rendelkező alkalmazások esetében, amikor a felhasználó a dpi értékét 120-ra állítja, de akkor hajtja végre, ha a dpi egyéni értéke 144 vagy annál magasabb. A felhasználó azonban felülbírálhatja az alapértelmezett viselkedést.

A képernyőméretezés új kihívásokat teremt az olyan alkalmazások számára, amelyek bármilyen módon érintik a képernyőkoordinátákat. A képernyő most két koordinátarendszert tartalmaz: fizikai és logikai. Egy pont fizikai koordinátái a forrás bal felső részén található képpontokban kifejezett tényleges eltolások. A logikai koordináták azokat az eltolásokat jelentik, mintha maguk a képpontok lennének skálázva.

Tegyük fel, hogy egy gombot tartalmazó párbeszédpanelt tervez a koordinátáknál (100, 48). Ha ez a párbeszédpanel az alapértelmezett 96 dpi-n jelenik meg, a gomb a (100, 48) fizikai koordinátáin található. 120 dpi-nál a (125, 60) fizikai koordinátákon található. A logikai koordináták azonban minden dpi-beállításnál megegyeznek: (100, 48).

A logikai koordináták azért fontosak, mert a dpi-beállítástól függetlenül konzisztenssé teszik az operációs rendszer és az alkalmazások viselkedését. Általában például Cursor.Position a logikai koordinátákat adja vissza. Ha a kurzort egy párbeszédpanel egy eleme fölé helyezi, a dpi-beállítástól függetlenül ugyanazokat a koordinátákat adja vissza. Ha a vezérlőt a (100, 100) értékre rajzolja, az a logikai koordinátákhoz lesz rajzolva, és bármely dpi-beállításnál ugyanazt a relatív pozíciót foglalja el.

Skálázás a felhasználói felületi automatizálási ügyfelekben

A UI Automation API nem használ logikai koordinátákat. Az alábbi módszerek és tulajdonságok fizikai koordinátákat adnak vissza, vagy paraméterekként veszik fel őket.

Alapértelmezés szerint egy nem 96 dpi-s környezetben futó UI Automation-ügyfélalkalmazás nem tud megfelelő eredményeket kapni ezekből a módszerekből és tulajdonságokból. Mivel például a kurzor pozíciója logikai koordinátákban van, az ügyfél nem tudja egyszerűen átadni ezeket a koordinátákat a kurzor alatti elem beszerzéséhez FromPoint . Emellett az alkalmazás nem tudja megfelelően elhelyezni az ablakokat az ügyfélterületén kívül.

A megoldás két részből áll.

  1. Először az ügyfélalkalmazást tegye dpi-tudatossá. Ehhez hívja meg a Win32 függvényt SetProcessDPIAware indításkor. A felügyelt kódban az alábbi deklaráció elérhetővé teszi ezt a függvényt.

    [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
    

    Ez a függvény a teljes folyamatot dpi-tudatossá teszi, ami azt jelenti, hogy a folyamathoz tartozó összes ablak skálázatlan. A kiemelőmintában például a kiemelő téglalapot alkotó négy ablak a felhasználói felület Automation által kapott fizikai koordinátákon található, nem pedig a logikai koordinátákon. Ha a minta nem lenne dpi-kompatibilis, a kiemelést az asztalon lévő logikai koordináták szerint rajzolnák meg, ami helytelen elhelyezést okozna egy nem 96 dpi-s környezetben.

  2. A kurzor koordinátáinak lekéréséhez hívja meg a Win32 függvényt GetPhysicalCursorPos. Az alábbi példa bemutatja, hogyan deklarálhatja és használhatja ezt a függvényt.

    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
    

Figyelmeztetés

Ne használja az Cursor.Position értéket. A tulajdonság viselkedése egy skálázott környezetben lévő ügyfélablakon kívül nincs meghatározva.

Ha az alkalmazás közvetlen, folyamatközi kommunikációt folytat olyan alkalmazásokkal, amelyek nem rendelkeznek dpi-tudatossággal, lehet, hogy a logikai és fizikai koordináták között kell átalakítania a Win32 függvények PhysicalToLogicalPoint és LogicalToPhysicalPoint használatával.

Lásd még