UI 자동화 및 화면 크기 조정UI Automation and Screen Scaling

참고

이 설명서는 System.Windows.Automation 네임스페이스에 정의된 관리되는 UI 자동화UI Automation 클래스를 사용하려는 .NET Framework 개발자를 위한 것입니다.This documentation is intended for .NET Framework developers who want to use the managed UI 자동화UI Automation classes defined in the System.Windows.Automation namespace. UI 자동화UI Automation에 대한 최신 정보는 Windows 자동화 API: UI 자동화를 참조하세요.For the latest information about UI 자동화UI Automation, see Windows Automation API: UI Automation.

Windows VistaWindows Vista 을 통해 사용자가 dpi(인치당 도트 수)dots per inch (dpi) 설정을 변경할 수 있으므로 대부분의 UI(사용자 인터페이스)user interface (UI) 요소가 화면에 크게 표시됩니다. enables users to change the dpi(인치당 도트 수)dots per inch (dpi) setting so that most UI(사용자 인터페이스)user interface (UI) elements on the screen appear larger. 이 기능은 Microsoft WindowsMicrosoft Windows에서 오래 전부터 사용할 수 있었지만, 이전 버전에서는 크기 조정을 응용 프로그램에서 구현해야 했습니다.Although this feature has long been available in Microsoft WindowsMicrosoft Windows, in previous versions the scaling had to be implemented by applications. Windows VistaWindows Vista에서 바탕 화면 창 관리자는 자체 크기 조정을 처리하지 않는 모든 응용 프로그램에 기본 크기 조정을 수행합니다.In Windows VistaWindows Vista, the Desktop Window Manager performs default scaling for all applications that do not handle their own scaling. UI 자동화 클라이언트 응용 프로그램에서는 이 기능을 고려해야 합니다.UI Automation client applications must take this feature into account.

Windows Vista에서 크기 조정Scaling in Windows Vista

기본 dpidpi 설정은 96이며, 96픽셀이 1인치의 추상적 너비 또는 높이를 차지한다는 의미입니다.The default dpidpi setting is 96, which means that 96 pixels occupy a width or height of one notional inch. "인치"의 정확한 측정값은 모니터의 크기와 실제 해상도에 따라 달라집니다.The exact measure of an "inch" depends on the size and physical resolution of the monitor. 예를 들어, 12인치 너비의 모니터에서 1280픽셀의 수평 해상도의 경우 96픽셀의 가로줄은 1인치의 약 9/10입니다.For example, on a monitor 12 inches wide, at a horizontal resolution of 1280 pixels, a horizontal line of 96 pixels extends about 9/10 of an inch.

dpidpi 설정을 변경하는 것은 화면 해상도를 변경하는 것과 같지 않습니다.Changing the dpidpi setting is not the same as changing the screen resolution. dpidpi 크기 조정을 통해, 화면의 실제 픽셀 수는 동일하게 유지됩니다.With dpidpi scaling, the number of physical pixels on the screen remains the same. 하지만 크기 조정은 UIUI 요소의 크기와 위치에 적용됩니다.However, scaling is applied to the size and location of UIUI elements. 크기를 조정하지 말라는 메시지가 명시적으로 표시되지 않는 데스크톱 및 응용 프로그램에 대해서는 바탕 화면 창 관리자가 이 크기 조정을 자동으로 수행할 수 있습니다.This scaling can be performed automatically by the Desktop Window Manager (DWM) for the desktop and for applications that do not explicitly ask not to be scaled.

실제로, 사용자가 배율 인수를 120 dpidpi로 설정하면 화면의 가로 또는 세로 인치가 25% 커집니다.In effect, when the user sets the scale factor to 120 dpidpi, a vertical or horizontal inch on the screen becomes bigger by 25 percent. 그에 따라 모든 치수가 적절하게 조정됩니다.All dimensions are scaled accordingly. 화면 위쪽에서 왼쪽 가장자리까지 응용 프로그램 창의 오프셋이 25% 늘어납니다.The offset of an application window from the top and left edges of the screen increases by 25 percent. 응용 프로그램 크기 조정을 사용하고 있고 이 응용 프로그램에서 dpidpi가 인식되지 않으면, 창 크기는 여기에 포함된 모든 UIUI 요소의 오프셋과 크기와 함께 동일한 비율로 증가됩니다.If application scaling is enabled and the application is not dpidpi-aware, the size of the window increases in the same proportion, along with the offsets and sizes of all UIUI elements it contains.

참고

기본적으로 DWM은 사용자가dpidpi를 120으로 설정하면 비 dpidpi 인식 응용 프로그램에 대해 크기 조정을 수행하지 않지만 dpidpi 가 144 이상의 사용자 지정 값으로 설정되면 크기 조정을 수행합니다.By default, the DWM does not perform scaling for non-dpidpi-aware applications when the user sets the dpidpi to 120, but does perform it when the dpidpi is set to a custom value of 144 or higher. 그러나 사용자는 기본 동작을 재정의할 수 있습니다.However, the user can override the default behavior.

화면 크기 조정 어떤 방식으로든 화면 좌표와 관련된 응용 프로그램에 대한 새로운 문제를 만듭니다.Screen scaling creates new challenges for applications that are concerned in any way with screen coordinates. 이제 화면에는 물리적 좌표와 논리적 좌표 두 개가 포함됩니다.The screen now contains two coordinate systems: physical and logical. 점의 물리적 좌표는 원점의 왼쪽 상단에서의 픽셀 단위의 실제 오프셋입니다.The physical coordinates of a point are the actual offset in pixels from the top left of the origin. 논리적 좌표는 픽셀 자체의 크기가 조정된 경우 발생되는 오프셋입니다.The logical coordinates are the offsets as they would be if the pixels themselves were scaled.

좌표 (100, 48)에서 단추가 있는 대화 상자를 설계한다고 가정해 보세요.Suppose you design a dialog box with a button at coordinates (100, 48). 이 대화 상자가 기본 96 dpidpi에서 표시되면 단추는 물리적 좌표 (100, 48)에 위치합니다.When this dialog box is displayed at the default 96 dpidpi, the button is located at physical coordinates of (100, 48). 120 dpidpi에서 표시되면 단추는 물리적 좌표 (125, 60)에 위치합니다.At 120 dpidpi, it is located at physical coordinates of (125, 60). 하지만 논리적 좌표는 모든 dpidpi 설정에서 (100, 48)로 동일합니다.But the logical coordinates are the same at any dpidpi setting: (100, 48).

논리적 좌표는 dpidpi 설정과 관계없이 운영 체제와 응용 프로그램의 동작을 일관적으로 유지하기 때문에 중요합니다.Logical coordinates are important, because they make the behavior of the operating system and applications consistent regardless of the dpidpi setting. 예를 들어 Cursor.Position 일반적으로 논리적 좌표를 반환 합니다.For example, Cursor.Position normally returns the logical coordinates. 대화 상자에서 요소 위에 커서를 놓으면 dpidpi 설정과 관계 없이 동일한 좌표가 반환됩니다.If you move the cursor over an element in a dialog box, the same coordinates are returned regardless of the dpidpi setting. 좌표 (100, 100)에서 컨트롤을 그리면 논리적 좌표로 그려지고 모든 dpidpi 설정에서 동일한 상대적 위치를 차지합니다.If you draw a control at (100, 100), it is drawn to those logical coordinates, and will occupy the same relative position at any dpidpi setting.

UI 자동화 클라이언트의 크기 조정Scaling in UI Automation Clients

UI 자동화UI Automation APIAPI 는 논리적 좌표를 사용하지 않습니다.The UI 자동화UI Automation APIAPI does not use logical coordinates. 다음 메서드 및 속성은 물리적 좌표를 반환하거나 매개 변수로 간주합니다.The following methods and properties either return physical coordinates or take them as parameters.

기본적으로, 96 dpidpi 가 아닌 환경에서 실행되는 UI 자동화 클라이언트 응용 프로그램은 이러한 메서드와 속성에서 올바른 결과를 얻을 수 없습니다.By default, a UI Automation client application running in a non-96- dpidpi environment will not be able to obtain correct results from these methods and properties. 예를 들어, 커서 위치는 논리적 좌표에 있기 때문에 클라이언트가 이러한 좌표를 FromPoint 에 간단히 전달하여 커서 아래에 있는 요소를 가져올 수 없습니다.For example, because the cursor position is in logical coordinates, the client cannot simply pass these coordinates to FromPoint to obtain the element that is under the cursor. 또한 응용 프로그램이 클라이언트 영역 외부에 창을 올바르게 배치할 수 없습니다.In addition, the application will not be able to correctly place windows outside its client area.

솔루션은 두 부분으로 구성됩니다.The solution is in two parts.

  1. 먼저 클라이언트 응용 프로그램이 dpidpi를 인식하도록 설정합니다.First, make the client application dpidpi-aware. 이렇게 하려면 시작 시에 Win32Win32 함수 SetProcessDPIAware 를 호출합니다.To do this, call the Win32Win32 function SetProcessDPIAware at startup. 관리 코드에서, 다음 선언을 통해 이 함수를 사용할 수 있습니다.In managed code, the following declaration makes this function available.

    [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
    

    이 함수를 사용하면 전체 프로세스 dpidpi가 인식되므로 프로세스에 속하는 모든 창이 실제 크기로 유지됩니다.This function makes the entire process dpidpi-aware, meaning that all windows that belong to the process are unscaled. 강조 표시 샘플, 강조 표시 사각형을 구성 하는 네 개의 창이 예를 들어, 다음 위치에서 가져온 물리적 좌표에 있습니다 UI 자동화UI Automation, 논리적 좌표가 아닌 합니다.In the Highlighter Sample, for instance, the four windows that make up the highlight rectangle are located at the physical coordinates obtained from UI 자동화UI Automation, not the logical coordinates. 샘플에서 dpidpi가 인식되지 않으면 강조 표시가 데스크톱의 논리적 좌표에 그려지며, 그에 따라 96 이외의 dpidpi 환경에서 배치가 잘못될 수 있습니다.If the sample were not dpidpi-aware, the highlight would be drawn at the logical coordinates on the desktop, which would result in incorrect placement in a non-96- dpidpi environment.

  2. 커서 좌표를 가져오려면 Win32Win32 함수 GetPhysicalCursorPos를 호출합니다.To get cursor coordinates, call the Win32Win32 function GetPhysicalCursorPos. 다음 예제에서는 이 함수를 선언하고 사용하는 방법을 보여 줍니다.The following example shows how to declare and use this function.

    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
    

주의

사용 하지 마십시오 Cursor.Position합니다.Do not use Cursor.Position. 크기가 조정된 환경에서 클라이언트 창 외부에서의 이 속성 동작이 정의되지 않았습니다.The behavior of this property outside client windows in a scaled environment is undefined.

사용하는 응용 프로그램에서 비 dpidpi인식 응용 프로그램과 직접 크로스 프로세스 통신을 수행하는 경우 Win32Win32 함수 PhysicalToLogicalPointLogicalToPhysicalPoint를 사용하여 논리적 좌표와 물리적 좌표 간을 변환했을 수 있습니다.If your application performs direct cross-process communication with non- dpidpi-aware applications, you may have convert between logical and physical coordinates by using the Win32Win32 functions PhysicalToLogicalPoint and LogicalToPhysicalPoint.

참고 항목See Also

강조 표시 샘플Highlighter Sample