다음을 통해 공유


UI 자동화 클라이언트에서 캐싱

비고

이 설명서는 System.Windows.Automation 네임스페이스에 정의된 관리되는 UI 자동화 클래스를 사용하려는 .NET Framework 개발자를 위한 것입니다. UI 자동화에 대한 최신 정보는 Windows Automation API: UI 자동화참조하세요.

이 항목에서는 UI 자동화 속성 및 컨트롤 패턴의 캐싱을 소개합니다.

UI 자동화에서 캐싱은 데이터의 사전 인출을 의미합니다. 그런 다음 추가 프로세스 간 통신 없이 데이터에 액세스할 수 있습니다. 캐싱은 일반적으로 UI 자동화 클라이언트 애플리케이션에서 속성을 검색하고 패턴을 대량으로 제어하는 데 사용됩니다. 그런 다음 필요에 따라 캐시에서 정보를 검색합니다. 애플리케이션은 UI(사용자 인터페이스)의 항목이 변경되었음을 나타내는 이벤트에 대한 응답으로 캐시를 주기적으로 업데이트합니다.

캐싱의 이점은 WPF(Windows Presentation Foundation) 컨트롤 및 서버 쪽 UI 자동화 공급자가 있는 사용자 지정 컨트롤에서 가장 두드러집니다. Win32 컨트롤의 기본 공급자와 같은 클라이언트 쪽 공급자에 액세스할 때는 이점이 적습니다.

캐싱은 애플리케이션이 a CacheRequest 를 활성화한 다음 , 예를 들어 AutomationElementFindFirst반환하는 FindAll메서드 또는 속성을 사용할 때 발생합니다. 클래스의 TreeWalker 메서드는 예외입니다. 캐싱은 매개 변수로 지정된 경우에만 CacheRequest 수행됩니다(예 TreeWalker.GetFirstChild(AutomationElement, CacheRequest): .)

캐싱은 활성 상태인 동안 CacheRequest 이벤트를 구독할 때도 발생합니다. AutomationElement 이벤트 원본으로 이벤트 처리기에 전달된 속성에는 원래 CacheRequest속성에 지정된 캐시된 속성과 패턴이 포함됩니다. 이벤트를 구독한 후 CacheRequest에 가해진 변경 사항은 효과가 없습니다.

요소의 UI 자동화 속성 및 컨트롤 패턴을 캐시할 수 있습니다.

캐싱 옵션

CacheRequest 캐싱에 대한 다음 옵션을 지정합니다.

캐시할 속성

요청을 활성화하기 전에 각 속성에 대해 호출 Add(AutomationProperty) 하여 캐시할 속성을 지정할 수 있습니다.

컨트롤 패턴을 캐시하기

요청을 활성화하기 전에 각 패턴을 호출 Add(AutomationPattern) 하여 캐시할 컨트롤 패턴을 지정할 수 있습니다. 패턴이 캐시되면 해당 속성은 자동으로 캐시되지 않습니다. 를 사용하여 CacheRequest.Add캐시하려는 속성을 지정해야 합니다.

캐싱 범위 및 필터링

요청을 활성화하기 전에 속성을 설정 CacheRequest.TreeScope 하여 캐시하려는 속성 및 패턴을 지정할 수 있습니다. 범위는 요청이 활성 상태인 동안 검색되는 요소를 기준으로 합니다. 예를 들어, Children만 설정하고 AutomationElement를 검색하면, 그 요소의 자식 요소의 속성과 패턴은 캐시되지만, 요소 자체의 속성과 패턴은 캐시되지 않습니다. 검색된 요소 자체에 대해 캐싱이 수행되도록 하려면 ElementTreeScope 속성에 포함해야 합니다. 범위를 Parent 설정하거나 Ancestors으로 설정할 수 없습니다. 자식 요소가 캐시될 때, 부모 요소도 함께 캐시될 수 있습니다. 자세한 내용은 캐시된 자식 및 부모 검색을 참조하세요.

캐싱의 범위도 속성의 영향을 받습니다 CacheRequest.TreeFilter . 기본적으로 캐싱은 UI 자동화 트리의 컨트롤 뷰에 표시되는 요소에 대해서만 수행됩니다. 그러나 이 속성을 변경하여 모든 요소에 캐싱을 적용하거나 콘텐츠 보기에 표시되는 요소에만 적용할 수 있습니다.

요소 참조의 강도

검색할 AutomationElement때 기본적으로 캐시되지 않은 요소를 포함하여 해당 요소의 모든 속성 및 패턴에 액세스할 수 있습니다. 효율성을 더욱 높이고자 한다면, AutomationElementModeCacheRequest 속성을 None로 설정하여 요소에 대한 참조가 캐시된 데이터에만 해당되도록 지정할 수 있습니다. 이 경우 캐시되지 않은 속성 및 검색된 요소의 패턴에 액세스할 수 없습니다. GetCurrentPropertyValue, Current, AutomationElement 또는 어떤 컨트롤 패턴의 속성에도 액세스할 수 없다는 것을 의미합니다. 또한 GetCurrentPattern 또는 TryGetCurrentPattern 사용하여 패턴을 검색할 수도 없습니다. 캐시된 패턴에서는 배열 속성을 SelectionPattern.SelectionPatternInformation.GetSelection검색하는 메서드를 호출할 수 있지만 컨트롤에 대한 InvokePattern.Invoke작업을 수행하는 메서드는 호출할 수 없습니다.

개체에 대한 전체 참조가 필요하지 않을 수 있는 애플리케이션의 예로는 화면 읽기 프로그램이 있습니다. 이 프로그램은 창에 있는 요소의 NameControlType 속성을 미리 가져오지만, AutomationElement 개체 자체는 필요하지 않습니다.

CacheRequest 활성화

AutomationElement 캐싱은 현재 스레드에 대해 CacheRequest가 활성 상태일 때만 개체가 검색됩니다. CacheRequest를 활성화하는 방법에는 두 가지가 있습니다.

일반적인 방법은 호출 Activate하는 것입니다. 이 메서드는 구현하는 개체를 반환합니다 IDisposable. 요청은 개체가 존재하는 한 IDisposable 활성 상태로 유지됩니다. 개체의 수명을 제어하는 가장 쉬운 방법은 (C#) 또는 using (Visual Basic) 블록 내에서 호출을 Using 묶는 것입니다. 이렇게 하면 예외가 발생하더라도 스택에서 요청이 팝업됩니다.

캐시 요청을 중첩하려는 경우 유용한 또 다른 방법은 호출 Push하는 것입니다. 그러면 요청이 스택에 배치되고 활성화됩니다. 요청은 스택 Pop에서 제거될 때까지 활성 상태로 유지됩니다. 다른 요청이 스택에 푸시되면 요청이 일시적으로 비활성 상태가 됩니다. 스택의 상위 요청만 활성 상태입니다.

캐시된 속성 검색

다음 메서드 및 속성을 통해 요소의 캐시된 속성을 검색할 수 있습니다.

요청된 속성이 캐시에 없는 경우 예외가 발생합니다.

Cached와 같이 Current개별 속성을 구조체의 멤버로 노출합니다. 그러나 이 구조를 검색할 필요는 없습니다. 개별 속성에 직접 액세스할 수 있습니다. 예를 들어 Name 속성은 element.Cached.Name에서 얻을 수 있으며, elementAutomationElement입니다.

캐시된 컨트롤 패턴 검색

다음 메서드를 통해 요소의 캐시된 컨트롤 패턴을 검색할 수 있습니다.

패턴이 캐시 GetCachedPattern 에 없으면 예외를 발생시키고 TryGetCachedPattern 반환합니다 false.

패턴 개체의 속성을 사용하여 Cached 컨트롤 패턴의 캐시된 속성을 검색할 수 있습니다. 속성을 통해 Current 현재 값을 검색할 수도 있지만 None를 검색할 때 AutomationElement가 지정되지 않은 경우에만 가능합니다. (Full 는 기본값이며 현재 값에 대한 액세스를 허용합니다.)

캐시된 자식 및 부모 검색

AutomationElement 요소를 검색하고 요청의 TreeScope 속성을 통해 해당 요소의 자식 요소에 대한 캐싱을 요청하면, 이후에 검색한 요소의 CachedChildren 속성에서 자식 요소를 가져올 수 있습니다.

캐시 요청의 범위에 Element가 포함된 경우, 요청의 루트 요소는 이후 자식 요소의 CachedParent 속성에서 사용할 수 있습니다.

비고

요청의 루트 요소에 대한 부모 또는 상위 항목을 캐시할 수 없습니다.

캐시 업데이트

캐시는 UI에서 아무 것도 변경되지 않는 한 유효합니다. 애플리케이션은 일반적으로 이벤트에 대한 응답으로 캐시를 업데이트해야 합니다.

활성화된 CacheRequest가 있는 동안 이벤트를 구독하면, 이벤트 처리기 대리자가 호출될 때마다 AutomationElement의 원본으로 업데이트된 캐시를 얻습니다. 를 호출 GetUpdatedCache하여 요소에 대한 캐시된 정보를 업데이트할 수도 있습니다. 원본 CacheRequest 을 전달하여 이전에 캐시된 모든 정보를 업데이트할 수 있습니다.

캐시를 업데이트해도 기존 AutomationElement 참조의 속성은 변경되지 않습니다.

참고하십시오