Server-Side UI Otomasyonu Sağlayıcısı Uygulaması

Uyarı

Bu dokümantasyon, System.Windows.Automation ad alanında tanımlı olan yönetilen UI Otomasyon sınıflarını kullanmak isteyen .NET Framework geliştiricilerine 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, AutomationPeer öğesinden türetilen bir sınıf aracılığıyla Kullanıcı Arayüzü 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ışabilecek şekilde 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, AutomationElement gibi UIAutomationClient.dll sınıflarındaki alanları kullanmayın. Bunun yerine, gibi AutomationElementIdentifiersUIAutomationTypes.dllsınıflarındaki eşdeğer alanları kullanın.

Windows Presentation Foundation Öğeleriyle 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.

Arayüz 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'den devralır. Karmaşık bir denetimdeki öğeye işlevsellik ekler, bu işlevler arasında parça içinde gezinme, odağı ayarlama ve öğenin sınırlayıcı dikdörtgenini döndürme yer alır.
IRawElementProviderFragmentRoot IRawElementProviderFragment'den 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.

Arayüz Açıklama
IRawElementProviderAdviseEvents Sağlayıcının olaylara yönelik istekleri izlemesini sağlar.
IRawElementProviderHwndOverride Bir parçanın UI Otomasyonu ağacında pencere tabanlı öğelerin yeniden konumlandırılmasına olanak tanır.

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:

İşlevsellik Uygulama
Sağlayıcıyı UI Otomasyonu'na sunma 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ğerlerini sağla Değerleri sağlamak veya geçersiz kılmak için GetPropertyValue uygulayın.
İstemcinin denetimle etkileşim kurmasını sağlama gibi IInvokeProviderdenetim desenlerini destekleyen arabirimler uygulayın. Uygulamanızda GetPatternProvider. için bu desen sağlayıcılarını döndürün.
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.)
Parçacıkta alt öğenin odak ve konumlandırmasını 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ı, hem otomasyon sistemi hem de istemci uygulamaları tarafından kullanılabilecek belirli özellikleri desteklemelidir. 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 almalıdır.

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

Uyarı

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.

Bu IsKeyboardFocusableProperty, Windows Forms denetiminde çalıştı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 çekemeyebilir.

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

Örnek kod için, bkz UI Otomasyon Sağlayıcısından Özelliklerin Döndürülmesi.

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.

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

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

Performansı iyileştirmek için, bir sağlayıcı olayları seçmeli olarak tetikleyebilir veya alacak bir istemci uygulaması kayıtlı değilse hiç olay tetiklemeyebilir. İyileştirme için aşağıdaki yöntemler kullanılır.

Yöntem Açıklama
ClientsAreListening Bu statik özellik, herhangi bir istemci uygulamasının UI Otomasyonu olaylarına abone olup olmadığını belirtir.
IRawElementProviderAdviseEvents Sağlayıcının bu arabirimi bir parçanın kökünde uygulaması, istemciler parçadaki olaylar için olay işleyicilerini kaydedip sildiklerinde sağlayıcının bilgilendirilmesine olanak tanır.

WPF Dışı Sağlayıcı Navigasyonu

Bir pencerede barındırılan özel düğme (HWND) gibi basit denetimlerin sağlayıcılarının UI Otomasyonu ağacında gezintiyi desteklemesi gerekmez. öğeye ve öğeden gezinti, HostRawElementProvider'ın uygulamasında belirtilen 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.

Uyarı

Kök dışındaki bir parçanın öğeleri, doğrudan bir pencerede barındırılmadıklarından ve varsayılan bir sağlayıcı tarafından bu öğelere yönelik gezinti desteklenemediğinden HostRawElementProvider öğesinden bir null başvurusu 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öntem 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 FirstChild olduğunda listedeki ilk öğeyi ve yön LastChild olduğunda son öğeyi döndürür. Parça kökü, üst öğeye veya eşdüzeylere gezinmeyi desteklemez; bu işlem konak pencere sağlayıcısı tarafından gerçekleştirilir.

Kök olmayan bir parçanın elemanları, ebeveyne, sahip oldukları kardeş ve alt elemanlara gezintiyi destekleyebilmelidir.

WPF Dışı Sağlayıcı Yeniden Ebeveynlendirme

Açılır pencereler aslında en üst düzey pencerelerdir ve bu nedenle 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. HostRawElementProvider özelliğini, açılan pencerenin pencere tutamacı parametresini HostProviderFromHandle'e geçirdiğinizde elde edilen değeri döndürmesi için uygulayın.

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

UI Otomasyonu açılır pencereyle karşılaştığında, gezintinin varsayılan ayarlardan saptığını algılar ve masaüstünün bir alt öğesi olarak karşılaştığında açılır pencereyi atlar. Bunun yerine düğüme yalnızca parça üzerinden erişilebilir.

Yeniden konumlandırma, bir denetimin herhangi bir sınıfa ait pencereyi 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 Dışı Sağlayıcının Yeniden Konumlandırılması

UI Otomasyonu parçaları, her biri bir pencerede (HWND) bulunan iki veya daha fazla öğe içerebilir. Her HWND, içerildiği HWND'nin alt öğesi olarak kabul eden kendi varsayılan sağlayıcısına sahip olduğundan, UI Otomasyon 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, metin kutusu veya açılır liste kutusu gibi HWND tabanlı bir denetim içerebilen bantlar içerir. Rebar HWND'nin varsayılan pencere sağlayıcısı, bant denetimi HWND'lerini alt öğe olarak görürken, rebar sağlayıcısı da bantları alt öğe olarak algılar. 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 bir bant, özellikleri ve desenleri açığa çıkarabilen tek bir sağlayıcıya sahiptir. uygulamasında HostRawElementProvider, bant sağlayıcısı, kontrolün pencere tutamacını (window handle) argüman olarak kullanarak HostProviderFromHandle metodunu çağrılarak, kontrolün HWND'si 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 bakınız