Sunucu Tarafı UI Otomasyonu Sağlayıcıyı Uygulama

Not

Bu belgeler, ad alanında tanımlanan yönetilen UI Otomasyonu sınıflarını kullanmak isteyen .NET Framework geliştiricilerine System.Windows.Automation yöneliktir. UI Otomasyonu hakkında en son bilgiler için bkz. Windows Otomasyonu API'si: UI Otomasyonu.

Bu bölümde, özel denetim için sunucu tarafı UI Otomasyonu sağlayıcısının nasıl uygulandığı açıklanmaktadır.

Windows Presentation Foundation (WPF) öğelerinin ve WPF olmayan öğelerin (Windows Forms için tasarlanmış olanlar gibi) uygulanması temelde farklıdır. WPF öğeleri, öğesinden AutomationPeertüretilen bir sınıf aracılığıyla UI Otomasyonu için destek sağlar. WPF olmayan öğeler, sağlayıcı arabirimlerinin uygulamaları aracılığıyla destek sağlar.

Güvenlikle İlgili Dikkat Edilmesi Gerekenler

Sağlayıcılar kısmi güven ortamında çalışabilmeleri için yazılmalıdır. UIAutomationClient.dll kısmi güven altında çalışacak şekilde yapılandırılmadığından, sağlayıcı kodunuz bu derlemeye başvurmamalıdır. Böyle bir durumda kod tam güven ortamında çalıştırılabilir ancak kısmi güven ortamında başarısız olabilir.

Özellikle, içindekiler AutomationElementgibi UIAutomationClient.dll sınıflarındaki alanları kullanmayın. Bunun yerine, gibi UIAutomationTypes.dll AutomationElementIdentifierssınıflarındaki eşdeğer alanları kullanın.

Windows Presentation Foundation Öğeleri Tarafından Sağlayıcı Uygulaması

Bu konu hakkında daha fazla bilgi için bkz. WPF Özel Denetiminin UI Otomasyonu.

WPF Olmayan Öğelere Göre Sağlayıcı Uygulaması

WPF çerçevesinin parçası olmayan, ancak yönetilen kodda yazılan özel denetimler (çoğu zaman Bunlar Windows Forms denetimleridir), arabirimler uygulayarak UI Otomasyonu için destek sağlar. Her öğenin sonraki bölümdeki ilk tabloda listelenen arabirimlerden en az birini uygulaması gerekir. Ayrıca, öğe bir veya daha fazla denetim desenini destekliyorsa, her denetim deseni için uygun arabirimi uygulaması gerekir.

UI Otomasyonu sağlayıcı projeniz aşağıdaki derlemelere başvurmalıdır:

  • UIAutomationProviders.dll

  • UIAutomationTypes.dll

  • WindowsBase.dll

Sağlayıcı Arabirimleri

Her UI Otomasyonu sağlayıcısı aşağıdaki arabirimlerden birini uygulamalıdır.

Arabirim Açıklama
IRawElementProviderSimple Denetim desenleri ve özellikleri desteği de dahil olmak üzere bir pencerede barındırılan basit bir denetim için işlevsellik sağlar.
IRawElementProviderFragment IRawElementProviderSimple öğesinden devralır. Parça içinde gezinme, odağı ayarlama ve öğenin sınırlayıcı dikdörtgenini döndürme gibi karmaşık denetimdeki bir öğe için işlevsellik ekler.
IRawElementProviderFragmentRoot IRawElementProviderFragment öğesinden devralır. Bir alt öğeyi belirtilen koordinatlarda bulma ve tüm denetimin odak durumunu ayarlama dahil olmak üzere karmaşık bir denetimdeki kök öğe için işlevsellik ekler.

Aşağıdaki arabirimler ek işlevsellik sağlar ancak uygulanması gerekmez.

Arabirim Açıklama
IRawElementProviderAdviseEvents Sağlayıcının olaylara yönelik istekleri izlemesini sağlar.
IRawElementProviderHwndOverride Bir parçanın UI Otomasyonu ağacı içinde pencere tabanlı öğelerin yeniden konumlandırılması sağlar.

Ad alanı içindeki System.Windows.Automation.Provider diğer tüm arabirimler denetim deseni desteği içindir.

WPF Olmayan Sağlayıcılar için Gereksinimler

UI Otomasyonu ile iletişim kurmak için denetiminizin aşağıdaki temel işlevsellik alanlarını uygulaması gerekir:

İşlev Uygulama
Sağlayıcıyı UI Otomasyonu Denetim penceresine gönderilen bir WM_GETOBJECT iletisine yanıt olarak uygulayan IRawElementProviderSimple nesneyi (veya türetilmiş bir arabirimi) döndürebilirsiniz. Parçalar için bu, parça kökü için sağlayıcı olmalıdır.
Özellik değerleri sağlama Değerleri sağlamak veya geçersiz kılmak için uygulayın GetPropertyValue .
İstemcinin denetimle etkileşim kurmasını sağlama gibi IInvokeProviderdenetim desenlerini destekleyen arabirimler uygulayın. Uygulamanızda bu desen sağlayıcılarını döndürebilirsiniz GetPatternProvider.
Olayları tetikle İstemcinin dinleyebileceği bir olay oluşturmak için statik yöntemlerinden AutomationInteropProvider birini çağırın.
Parça içinde gezinmeyi ve odaklanmayı etkinleştirme Parça içindeki her öğe için uygulayın IRawElementProviderFragment . (Bir parçanın parçası olmayan öğeler için gerekli değildir.)
Bir parçada alt öğenin odaklanmasını ve konumunu etkinleştirme uygulayın IRawElementProviderFragmentRoot. (Parça kökü olmayan öğeler için gerekli değildir.)

WPF Olmayan Sağlayıcılarda Özellik Değerleri

Özel denetimler için UI Otomasyonu sağlayıcılarının hem otomasyon sistemi hem de istemci uygulamaları tarafından kullanılabilecek belirli özellikleri desteklemesi gerekir. Windows'ta (HWND) barındırılan öğeler için UI Otomasyonu bazı özellikleri varsayılan pencere sağlayıcısından alabilir, ancak diğer özellikleri özel sağlayıcıdan edinmelidir.

HWND tabanlı denetimlerin sağlayıcılarının genellikle aşağıdaki özellikleri sağlaması gerekmez (alan değerleriyle tanımlanır):

Not

RuntimeIdProperty Bir pencerede barındırılan basit bir öğenin veya parça kökünün değeri pencereden alınır; ancak, kökün altındaki parça öğelerinin (liste kutusundaki liste öğeleri gibi) kendi tanımlayıcılarını sağlaması gerekir. Daha fazla bilgi için bkz. GetRuntimeId.

bir IsKeyboardFocusableProperty Windows Forms denetiminde barındırılan sağlayıcılar için döndürülmelidir. Bu durumda, varsayılan pencere sağlayıcısı doğru değeri alamıyor olabilir.

NameProperty genellikle konak sağlayıcısı tarafından sağlanır. Örneğin, özel bir denetim'den Controltüretilirse, ad denetimin Text özelliğinden türetilir.

Örneğin kod, bkz. UI Otomasyonu Sağlayıcısından Özellik Döndürme.

WPF Olmayan Sağlayıcılardaki Olaylar

UI Otomasyonu sağlayıcıları, istemci uygulamalarına kullanıcı arabiriminin durumundaki değişiklikleri bildirmek için olayları tetiklemelidir. Olayları yükseltmek için aşağıdaki yöntemler kullanılır.

Metot Açıklama
RaiseAutomationEvent Denetim desenleri tarafından tetiklenen olaylar da dahil olmak üzere çeşitli olaylar oluşturur.
RaiseAutomationPropertyChangedEvent bir UI Otomasyonu özelliği değiştiğinde bir olay oluşturur.
RaiseStructureChangedEvent UI Otomasyonu ağacının yapısı değiştiğinde, örneğin bir öğenin kaldırılması veya eklenmesiyle bir olay oluşturur.

Olayın amacı, etkinliğin UI Otomasyonu sisteminin kendisi tarafından tetiklenip tetiklenmediğini kullanıcı arabiriminde (UI) gerçekleşen bir şeyi istemciye bildirmektir. Örneğin, tarafından tanımlanan InvokedEvent olay, doğrudan kullanıcı girişi veya istemci uygulaması tarafından çağrılarak Invokedenetim çağrıldığında tetiklenmelidir.

Performansı iyileştirmek için, sağlayıcı olayları seçmeli olarak oluşturabilir veya almak üzere hiçbir istemci uygulaması kaydedilmemişse hiç olay tetikleyemediğini gösterir. İyileştirme için aşağıdaki yöntemler kullanılır.

Metot Açıklama
ClientsAreListening Bu statik özellik, herhangi bir istemci uygulamasının UI Otomasyonu olaylara abone olup olmadığını belirtir.
IRawElementProviderAdviseEvents Sağlayıcının bu arabirimi bir parça kökünde uygulaması, istemciler parçadaki olaylar için olay işleyicilerini kaydedip kaydını sildiğinde bunun önerilmesine olanak tanır.

WPF Olmayan Sağlayıcı Gezintisi

Bir pencerede barındırılan özel düğme (HWND) gibi basit denetimlerin sağlayıcılarının UI Otomasyonu ağacı içinde gezintiyi desteklemesi gerekmez. öğesine ve öğesinden gezinti, uygulamasında HostRawElementProviderbelirtilen konak penceresi için varsayılan sağlayıcı tarafından işlenir. Ancak karmaşık bir özel denetim için bir sağlayıcı uyguladığınızda, parçanın kök düğümü ile alt öğeleri arasında ve eşdüzey düğümler arasında gezinmeyi desteklemeniz gerekir.

Not

Kök dışındaki bir parçanın öğeleri, doğrudan bir pencerede barındırılmadığından ve hiçbir varsayılan sağlayıcı bunlara gidip gelen gezintiyi destekleyemediğinden öğesinden HostRawElementProviderbir null başvuru döndürmelidir.

Parçanın yapısı, uygulamanız Navigatetarafından belirlenir. Her parçadan her olası yön için, bu yöntem bu yöndeki öğenin sağlayıcı nesnesini döndürür. Bu yönde öğe yoksa, yöntemi bir null başvuru döndürür.

Parça kökü yalnızca alt öğelere gezintiyi destekler. Örneğin, bir liste kutusu, yön olduğunda listedeki ilk öğeyi ve yön FirstChildolduğunda LastChildson öğeyi döndürür. Parça kökü üst öğeye veya eşdüzeylere gezintiyi desteklemez; bu, konak penceresi sağlayıcısı tarafından işlenir.

Kök olmayan bir parçanın öğeleri üst öğeye ve sahip oldukları eşdüzeylere ve alt öğelere gezintiyi desteklemelidir.

WPF Olmayan Sağlayıcı Yeniden Ayrışması

Açılır pencereler aslında en üst düzey pencerelerdir ve varsayılan olarak UI Otomasyonu ağacında masaüstünün alt öğeleri olarak görünür. Ancak çoğu durumda açılır pencereler mantıksal olarak başka bir denetimin alt öğeleridir. Örneğin, birleşik giriş kutusunun açılan listesi mantıksal olarak birleşik giriş kutusunun alt öğesidir. Benzer şekilde, menü açılır penceresi mantıksal olarak menünün alt öğesidir. UI Otomasyonu, ilişkili denetimin alt öğeleri gibi görünmeleri için açılır pencereleri yeniden ayrıştırma desteği sağlar.

Açılır pencereyi yeniden ayrıştmak için:

  1. Açılır pencere için bir sağlayıcı oluşturun. Bu, açılır pencerenin sınıfının önceden bilinmesini gerektirir.

  2. Kendi başına bir denetimmiş gibi, bu açılır pencere için her zamanki gibi tüm özellikleri ve desenleri uygulayın.

  3. parametresinin HostRawElementProvider açılır pencerenin pencere tutamacı olduğu bölümünden HostProviderFromHandleelde edilen değeri döndürmesi için özelliğini uygulayın.

  4. Gezintinin mantıksal üst öğeden mantıksal alt öğelere ve eşdüzey alt öğeler arasında düzgün bir şekilde işlenmesi için açılır pencere ve üst öğesi için uygulayın Navigate .

UI Otomasyonu açılır pencereyle karşılaştığında, gezintinin varsayılandan geçersiz kılındığını algılar ve masaüstünün alt öğesi olarak karşılaştığında açılır pencerenin üzerinden atlar. Bunun yerine düğüme yalnızca parça üzerinden erişilebilir.

Yeniden ayrıştırma, bir denetimin herhangi bir sınıfın penceresini barındırabileceği durumlar için uygun değildir. Örneğin, bir rebar bantlarında her tür HWND barındırabilir. Bu durumları işlemek için UI Otomasyonu, sonraki bölümde açıklandığı gibi alternatif bir HWND yeniden konumlandırma biçimini destekler.

WPF Olmayan Sağlayıcı Yeniden Konumlandırma

UI Otomasyonu parçalar, her biri bir pencerede (HWND) bulunan iki veya daha fazla öğe içerebilir. Her HWND'nin HWND'yi içeren bir alt öğe olarak kabul eden kendi varsayılan sağlayıcısı olduğundan, UI Otomasyonu ağacı varsayılan olarak parçadaki HWND'leri üst pencerenin alt öğeleri olarak gösterir. Çoğu durumda bu arzu edilen bir davranıştır, ancak bazen kullanıcı arabiriminin mantıksal yapısıyla eşleşmediğinden karışıklığa neden olabilir.

Buna iyi bir örnek, bir rebar denetimidir. Bir rebar, her biri araç çubuğu, düzenleme kutusu veya birleşik giriş kutusu gibi HWND tabanlı bir denetim içerebilen bantlar içerir. Rebar HWND için varsayılan pencere sağlayıcısı bant denetimi HWND'lerini alt öğe olarak, rebar sağlayıcısı ise bantları alt öğe olarak görür. HWND sağlayıcısı ve rebar sağlayıcısı birlikte çalıştığından ve alt öğelerini birleştirdiğinden, hem bantlar hem de HWND tabanlı denetimler, rebar'ın alt öğeleri olarak görünür. Ancak mantıksal olarak, yalnızca bantlar rebar'ın alt öğeleri olarak görünmelidir ve her bant sağlayıcısı, içerdiği denetim için varsayılan HWND sağlayıcısıyla birleştirilmelidir.

Bunu başarmak için, rebar için parça kök sağlayıcısı bantları temsil eden bir alt kümeyi kullanıma sunar. Her bant, özellikleri ve desenleri kullanıma sunan tek bir sağlayıcıya sahiptir. uygulamasında HostRawElementProviderbant sağlayıcısı, denetimin pencere tutamacını geçirerek çağırarak HostProviderFromHandleelde ettiği HWND denetimi için varsayılan pencere sağlayıcısını döndürür. Son olarak, rebar için parça kök sağlayıcısı arabirimini uygular IRawElementProviderHwndOverride ve uygulanmasında GetOverrideProviderForHwnd , belirtilen HWND'de yer alan denetim için uygun bant sağlayıcısını döndürür.

Ayrıca bkz.