다음을 통해 공유


UI 자동화 및 화면 크기 조정

참고참고

이 문서는 System.Windows.Automation 네임스페이스에 정의된 관리되는 UI Automation 클래스를 사용하려는 .NET Framework 개발자를 위해 작성되었습니다.UI Automation에 대한 최신 정보는 Windows Automation API: UI Automation을 참조하십시오.

Windows Vista에서는 사용자가 dots per inch (dpi) 설정을 변경하여 대부분의 user interface (UI) 요소를 화면에서 더 크게 표시할 수 있습니다. 이전 버전의 Microsoft Windows에서도 이 기능을 사용할 수는 있었지만 응용 프로그램에서 크기 조정을 구현해야 했습니다. Windows Vista에서는 크기 조정을 자체적으로 처리하지 않는 모든 응용 프로그램을 대신하여 DWM(데스크톱 창 관리자)이 기본 크기 조정 작업을 수행합니다. UI 자동화 클라이언트 응용 프로그램을 개발할 때는 이 기능을 고려해야 합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • Windows Vista의 크기 조정
  • UI 자동화 클라이언트의 크기 조정
  • 관련 항목

Windows Vista의 크기 조정

기본 dpi 설정은 96입니다. 즉, 개념상 1인치의 너비나 높이 안에 96개의 픽셀이 들어갑니다. "인치"의 정확한 측정값은 모니터의 크기와 실제 해상도에 따라 다릅니다. 예를 들어 너비가 12인치인 모니터에서 가로 해상도가 1280픽셀인 경우 가로 줄 96픽셀은 약 0.9인치가 됩니다.

dpi 설정을 변경하는 것과 화면 해상도를 변경하는 것은 다릅니다. dpi 설정을 변경하는 경우 화면상의 실제 픽셀 수는 동일하게 유지되지만, 이 변경 내용은 UI 요소의 크기와 위치에 적용됩니다. 이러한 크기 조정 작업은 크기 조정 작업을 명시적으로 거부하지 않는 응용 프로그램과 바탕 화면에 대해 DWM이 자동으로 수행할 수 있습니다.

실제로 사용자가 조정 인수를 120dpi로 설정하면 화면의 세로 또는 가로 인치가 25% 커집니다. 이에 따라 모든 크기가 조정됩니다. 화면 왼쪽 위 가장자리로부터의 응용 프로그램 창 오프셋이 25% 늘어납니다. dpi를 인식하지 못하는 응용 프로그램에서 크기 조정을 사용하는 경우 응용 프로그램에 포함된 모든 UI의 오프셋 및 크기와 함께 창 크기가 동일한 비율로 늘어납니다.

참고참고

기본적으로 DWM은 사용자가 dpi를 120으로 설정해도 dpi를 인식하지 않는 응용 프로그램에 대해서는 크기 조정 작업을 수행하지 않습니다. 그러나 dpi가 144 이상의 사용자 지정 값으로 설정되면 크기 조정 작업을 수행합니다.이 기본 동작은 사용자가 재정의할 수 있습니다.

화면 좌표와 어떤 식으로든 관련이 있는 응용 프로그램에서는 이 화면 크기 조정으로 인해 새로운 요구 사항을 구현해야 합니다. 이제 화면에는 물리적 좌표와 논리적 좌표라는 두 개의 좌표계가 사용됩니다. 점의 물리적 좌표는 왼쪽 위 원점을 기준으로 한 픽셀 단위의 실제 오프셋이고, 논리적 좌표는 픽셀 자체의 크기가 조정될 경우의 오프셋입니다.

좌표 (100, 48)에 단추가 한 개 있는 대화 상자를 디자인하는 경우를 가정해 봅니다. 이 대화 상자가 기본 설정인 96dpi로 표시되는 경우 단추의 실제 좌표는 (100, 48)이며, 120dpi에서는 실제 좌표가 (125, 60)입니다. 그러나 dpi 설정에 관계없이 논리적 좌표는 동일하게 (100, 48)입니다.

논리적 좌표는 dpi 설정에 관계없이 운영 체제와 응용 프로그램의 동작을 일관되게 만들므로 매우 중요합니다. 예를 들어, Cursor.Position은 일반적으로 논리적 좌표를 반환합니다. 대화 상자의 요소 위로 커서를 이동하면 dpi 설정에 관계없이 동일한 좌표가 반환됩니다. (100, 100)에 컨트롤을 그리면 해당되는 논리적 좌표에 컨트롤이 그려지며 어떤 dpi 설정에서든 동일한 상대 위치를 점유합니다.

UI 자동화 클라이언트의 크기 조정

UI Automation API에는 논리적 좌표가 사용되지 않습니다. 다음 메서드와 속성은 물리적 좌표를 반환하거나 물리적 좌표를 매개 변수로 사용합니다.

기본적으로 96dpi 이외의 환경에서 실행되는 UI 자동화 클라이언트 응용 프로그램은 이러한 메서드와 속성을 통해 정확한 결과를 얻을 수 없습니다. 예를 들어 커서 위치가 논리적 좌표에 있으므로 클라이언트가 단순히 논리적 좌표를 FromPoint에 전달해서는 현재 커서가 놓여 있는 요소를 가져올 수 없습니다. 뿐만 아니라 응용 프로그램은 해당 클라이언트 영역 외부에서 창을 올바르게 배치할 수 없습니다.

이 문제를 해결하려면 두 가지 작업을 수행해야 합니다.

  1. 먼저 클라이언트 응용 프로그램을 dpi를 인식하는 응용 프로그램으로 설정합니다. 이렇게 하려면 응용 프로그램을 시작할 때 Win32 함수 SetProcessDPIAware를 호출합니다. 관리 코드의 경우 다음 선언을 통해 이 함수를 사용할 수 있습니다.

    <System.Runtime.InteropServices.DllImport("user32.dll")> _
    Friend Shared Function SetProcessDPIAware() As Boolean
    End Function
    
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    internal static extern bool SetProcessDPIAware();
    

    이 함수는 전체 프로세스가 dpi를 인식하도록 만들므로 해당 프로세스에 속한 모든 창에 대해 크기 조정이 수행되지 않습니다. 예를 들어 Highlighter Sample에서 강조 표시 사각형을 구성하는 네 개의 창은 논리적 좌표가 아니라 UI Automation에서 가져온 물리적 좌표에 배치되어 있습니다. 샘플에서 dpi를 고려하지 않으면 바탕 화면의 논리적 좌표에 강조 표시 사각형이 그려지므로 96dpi가 아닌 환경에서는 사각형이 잘못 배치됩니다.

  2. 커서 좌표를 가져오려면 Win32 함수 GetPhysicalCursorPos를 호출합니다. 다음 예제에서는 이 함수를 선언하고 사용하는 방법을 보여 줍니다.

    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
    
    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;
        }
    }
    
주의 정보주의

Cursor.Position를 사용하지 마십시오.크기가 조정된 환경의 클라이언트 창 외부에서는 이 속성의 동작이 정의되지 않았습니다.

응용 프로그램이 dpi를 인식하지 않는 응용 프로그램과 프로세스 간 통신을 직접 수행하는 경우 Win32 함수 PhysicalToLogicalPoint 및 LogicalToPhysicalPoint를 사용하여 논리적 좌표와 물리적 좌표를 서로 변환해야 합니다. 

참고 항목

작업

Highlighter Sample