Sdílet prostřednictvím


Automatizace uživatelského rozhraní a změna velikosti obrazovky

Poznámka:

Tato dokumentace je určená pro vývojáře rozhraní .NET Framework, kteří chtějí používat spravované třídy model UI Automation definované v System.Windows.Automation oboru názvů. Nejnovější informace o model UI Automation najdete v tématu Rozhraní API služby Windows Automation: model UI Automation.

Systém Windows Vista umožňuje uživatelům změnit nastavení bodů na palec (dpi), aby se většina prvků uživatelského rozhraní na obrazovce zobrazovala větší. I když je tato funkce ve Windows už dlouho dostupná, v předchozích verzích bylo nutné škálování implementovat aplikacemi. Počínaje systémem Windows Vista provádí Správce desktopových oken výchozí škálování pro všechny aplikace, které nezpracují vlastní škálování. model UI Automation klientské aplikace musí tuto funkci zohlednit.

Škálování ve Windows Vista

Výchozí nastavení dpi je 96, což znamená, že 96 pixelů zabírá šířku nebo výšku jednoho notového palce. Přesná míra "palce" závisí na velikosti a fyzickém rozlišení monitoru. Například na monitoru o šířce 12 palců při vodorovném rozlišení 1280 pixelů se vodorovná čára 96 pixelů rozšiřuje o 9/10 palce.

Změna nastavení dpi není stejná jako změna rozlišení obrazovky. Při škálování dpi zůstane počet fyzických pixelů na obrazovce stejný. Škálování se ale použije na velikost a umístění prvků uživatelského rozhraní. Toto škálování může automaticky provést Správce desktopových oken (DWM) pro desktopovou plochu a pro aplikace, které explicitně nevyžadují škálování.

Když uživatel nastaví měřítko na 120 dpi, zvětší se svislý nebo vodorovný palec na obrazovce o 25 procent. Všechny dimenze se odpovídajícím způsobem škálují. Posun okna aplikace od horního a levého okraje obrazovky se zvýší o 25 procent. Pokud je povolené škálování aplikace a aplikace nerozeciluje dpi, velikost okna se zvýší ve stejném poměru spolu s posuny a velikostmi všech prvků uživatelského rozhraní, které obsahuje.

Poznámka:

Ve výchozím nastavení DWM neprovádí škálování pro aplikace bez dpi, když uživatel nastaví dpi na 120, ale provede ho, když je dpi nastavená na vlastní hodnotu 144 nebo vyšší. Uživatel ale může přepsat výchozí chování.

Škálování obrazovky vytváří nové výzvy pro aplikace, které se zajímají jakýmkoli způsobem se souřadnicemi obrazovky. Obrazovka teď obsahuje dva souřadnicové systémy: fyzické a logické. Fyzické souřadnice bodu jsou skutečným posunem v pixelech od levého horního okraje počátku. Logické souřadnice jsou posuny stejně, jako kdyby byly pixely samy o sobě měřítko.

Předpokládejme, že navrhujete dialogové okno s tlačítkem na souřadnicích (100, 48). Když se toto dialogové okno zobrazí ve výchozím nastavení 96 dpi, tlačítko se nachází ve fyzických souřadnicích (100, 48). Při 120 dpi se nachází ve fyzických souřadnicích (125, 60). Logické souřadnice jsou ale stejné při libovolném nastavení dpi: (100, 48).

Logické souřadnice jsou důležité, protože dělají chování operačního systému a aplikací konzistentní bez ohledu na nastavení dpi. Obvykle například Cursor.Position vrací logické souřadnice. Pokud přesunete kurzor na prvek v dialogovém okně, vrátí se stejné souřadnice bez ohledu na nastavení dpi. Pokud nakreslíte ovládací prvek na (100, 100), bude nakreslen na tyto logické souřadnice a bude zabírat stejnou relativní pozici při libovolném nastavení dpi.

Škálování v klientech model UI Automation

Rozhraní API model UI Automation nepoužívá logické souřadnice. Následující metody a vlastnosti buď vracejí fyzické souřadnice, nebo je převezmou jako parametry.

Ve výchozím nastavení nebude klientská aplikace model UI Automation spuštěná v prostředí bez rozlišení 96 dpi schopna získat správné výsledky z těchto metod a vlastností. Například vzhledem k tomu, že pozice kurzoru je v logických souřadnicích, nemůže klient tyto souřadnice jednoduše předat, aby FromPoint získal prvek, který je pod kurzorem. Aplikace navíc nebude moct správně umístit okna mimo svou klientskou oblast.

Řešení je ve dvou částech.

  1. Nejprve zajistěte, aby klientská aplikace věděla dpi. Uděláte to tak, že při spuštění zavoláte funkci SetProcessDPIAware Win32. Ve spravovaném kódu zpřístupní tato funkce následující deklarace.

    [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
    

    Tato funkce zpřístupňuje dpi celého procesu, což znamená, že všechna okna, která patří do procesu, nejsou škálovaná. V ukázce zvýrazňovače jsou například čtyři okna, která tvoří obdélník zvýraznění, umístěny ve fyzických souřadnicích získaných z model UI Automation, nikoli na logických souřadnicích. Pokud by vzorek nerozšiřoval dpi, zvýraznění by se nakreslelo na logické souřadnice na ploše, což by vedlo k nesprávnému umístění v prostředí bez rozlišení 96 dpi.

  2. Chcete-li získat souřadnice kurzoru, zavolejte funkci GetPhysicalCursorPosWin32 . Následující příklad ukazuje, jak deklarovat a používat tuto funkci.

    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
    

Upozornění

Nepoužívejte Cursor.Position. Chování této vlastnosti mimo okna klienta ve škálovaném prostředí není definováno.

Pokud vaše aplikace provádí přímou komunikaci mezi procesy s aplikacemi pracujícími bez dpi, můžete převést mezi logickými a fyzickými souřadnicemi pomocí funkcí PhysicalToLogicalPoint Win32 a LogicalToPhysicalPoint.

Viz také