Aracılığıyla paylaş


Özel özellikleri, olayları ve denetim desenlerini kaydetme

Özel özellik, olay veya denetim deseninin kullanılabilmesi için önce hem sağlayıcının hem de istemcinin özellik, olay veya denetim desenini çalışma zamanında kaydetmesi gerekir. Kayıt, bir uygulama işlemi içinde genel olarak etkilidir ve işlem kapanana veya son Microsoft UI Otomasyonu öğesi nesnesi (IUIAutomation veya IRawElementProviderSimple) işlem içinde serbest bırakılana kadar etkin kalır.

Kayıt işlemi, özel özellik, olay veya denetim deseni hakkında ayrıntılı bilgilerle birlikte UI Otomasyonu'na bir GUID geçirmeyi içerir. Aynı GUID'yi aynı bilgilerle ikinci kez kaydetme girişimi başarılı olur, ancak aynı GUID'yi ikinci kez ancak farklı bilgilerle (örneğin, farklı türde bir özel özellik) kaydetme girişimi başarısız olur. Gelecekte, özel belirtim kabul edilir ve UI Otomasyonu çekirdeğiyle tümleştirilirse, UI Otomasyonu özel kayıt bilgilerini doğrular ve "resmi" çerçeve uygulaması yerine zaten kayıtlı kodu kullanır ve böylece uygulama uyumluluğu sorunlarını en aza indirir. Zaten kayıtlı olan özellikleri, olayları veya denetim desenlerini kaldıramazsınız.

Bu konu aşağıdaki bölümleri içerir:

Özel Özellikleri ve Olayları Kaydetme

Özel bir özelliğin veya olayın kaydedilmesi, sağlayıcının ve istemcinin özellik veya olay için bir kimlik almasını sağlar. Bu kimlikler, kimlikleri parametre olarak alan çeşitli API yöntemlerine geçirilebilir.

Bir mülkü veya olayı kaydetmek için:

  1. Özel özellik veya olay için bir GUID tanımlayın.
  2. UIAutomationPropertyInfo veya UIAutomationEventInfo yapısını, GUID ve özel özelliğin veya olayın adını içeren ayrılmaz dize dahil olmak üzere özellik veya olay hakkındaki bilgilerle doldurun. Özel özellikler, özelliğin veri türünün de belirtilmesine (örneğin, özelliğin bir tamsayı veya dizeye sahip olması) gerektirir. Veri türü, UIAutomationType numaralandırması tarafından belirtilen aşağıdaki türlerden biri olmalıdır. Özel özellikler için başka hiçbir veri türü desteklenmez.
    • UIAutomationType_Bool
    • UI Otomasyon Türü_Çift
    • UIOtomasyonTürü_Öğe
    • UIAutomationType_Int
    • UIAutomationTürü_Nokta
    • UIAutomationType_String
  3. CUIAutomationRegistrar nesnesinin bir örneğini oluşturmak ve nesnenin IUIAutomationRegistrar arabirimine bir işaretçi almak için CoCreateInstance işlevini kullanın.
  4. IUIAutomationRegistrar::RegisterProperty veya RegisterEvent yöntemini çağırın ve UIAutomationPropertyInfo yapısının veya UIAutomationEventInfo yapısının adresini geçirin.

IUIAutomationRegistrar::RegisterProperty veya RegisterEvent yöntemi, bir uygulamanın böyle bir tanımlayıcıyı parametre olarak alan herhangi bir UI Otomasyonu yöntemine geçirebileceği bir özellik kimliği veya olay kimliği döndürür. Örneğin, kayıtlı özellik kimliğini IUIAutomationElement::GetCurrentPropertyValue yöntemine veya IUIAutomation::CreatePropertyCondition yöntemine geçirebilirsiniz.

Aşağıdaki örnekte özel bir özelliğin nasıl kaydedilecekleri gösterilmektedir.

// Declare a variable for holding the custom property ID.
PATTERNID g_MyCustomPropertyID;
// Define a GUID for the custom property.
GUID GUID_MyCustomProperty = { 0x82f383ff, 0x4b4d, 0x40d3, 
    { 0x8e, 0xd2, 0x90, 0xb5, 0x25, 0x8e, 0xaa, 0x19 } };

HRESULT RegisterProperty()
{
    // Fill the structure with the GUID, name, and data type.
    UIAutomationPropertyInfo MyCustomPropertyInfo = 
    {
        GUID_MyCustomProperty,
        L"MyCustomProp",
        UIAutomationType_String
    };

    // Create the registrar object and get the IUIAutomationRegistrar 
    // interface pointer. 
    IUIAutomationRegistrar * pUIARegistrar = NULL;
    CoCreateInstance(CLSID_CUIAutomationRegistrar, NULL, CLSCTX_INPROC_SERVER, 
            IID_IUIAutomationRegistrar, (void **)&pUIARegistrar);

    if (pUIARegistrar == NULL)
        return E_NOINTERFACE;

    // Register the property and retrieve the property ID. 
    HRESULT hr = pUIARegistrar->RegisterProperty(&MyCustomPropertyInfo, &g_MyCustomPropertyID);
    pUIARegistrar->Release();

    return hr;
}

IUIAutomationRegistrar::RegisterProperty ve RegisterEvent yöntemleri tarafından alınan özellik ve olay tanımlayıcıları yalnızca bunları alan uygulama bağlamında ve yalnızca uygulamanın ömrü boyunca geçerlidir. Kayıt yöntemleri, aynı uygulamanın farklı çalışma zamanı örnekleri üzerinden çağrıldığında aynı GUID için farklı tamsayı değerleri döndürebilir.

Özel özelliğin veya olayın kaydını kaldıran bir yöntem yoktur. Bunun yerine, son UI Otomasyonu nesnesi serbest bırakıldığında bunların kaydı örtük olarak silinir.

Önemli

Kodunuz bir Microsoft Etkin Erişilebilirlik (MSAA) istemcisiyse, özel bir özelliğin değerini değiştirdiğinizde NotifyWinEvent işlevini çağırmanız gerekir.

 

Özel Denetim Desenleri Uygulamak

Özel denetim deseni UI Otomasyonu API'sine dahil değildir, ancak çalışma zamanında üçüncü bir taraf tarafından sağlanır. İstemci ve sağlayıcı uygulamalarının geliştiricileri, denetim deseninin destekleyeceği yöntemler, özellikler ve olaylar da dahil olmak üzere özel bir denetim deseni tanımlamak için birlikte çalışmalıdır. Denetim desenini tanımladıktan sonra, hem istemcinin hem de sağlayıcının, denetim desenini çalışma zamanında kaydetmek için kodla birlikte destekleyici Bileşen Nesne Modeli (COM) nesnelerini uygulaması gerekir. Özel denetim deseni iki COM nesnesinin uygulanmasını gerektirir: istemci sarmalayıcı ve desen işleyicisi.

Dikkat

Aşağıdaki konulardaki örneklerde, mevcut Değeri denetim deseninin işlevselliğini çoğaltan özel bir denetim deseninin nasıl uygulandığını gösterilmektedir. Bu örnekler yalnızca yönerge amaçlıdır. Gerçek bir özel denetim deseni, standart UI Otomasyonu denetim desenlerinden kullanılamayan işlevler sağlamalıdır.

 

İstemci Sarmalayıcısı ve Desen İşleyicisi

İstemci sarmalayıcı, istemcinin özel denetim deseni tarafından sunulan özellikleri almak ve yöntemleri çağırmak için kullandığı API'yi uygular. API, tüm özellik isteklerini ve yöntem çağrılarını UI Otomasyonu çekirdeğine geçiren ve ardından istekleri ve çağrıları sağlayıcıya sıralayan bir COM arabirimi olarak uygulanır.

Özel denetim desenini kaydeden kodun, UI Otomasyonu'nun istemci sarmalayıcı nesnesinin örneklerini oluşturmak için kullanabileceği bir sınıf fabrikası sağlaması gerekir. Özel denetim deseni başarıyla kaydedildiğinde UI Otomasyonu, özellik isteklerini ve yöntem çağrılarını UI Otomasyonu çekirdeğine iletmek için istemci tarafından kullanılan bir IUIAutomationPatternInstance arabirim işaretçisi döndürür.

Sağlayıcı tarafında, UI Otomasyonu çekirdeği istemciden özellik isteklerini ve yöntem çağrılarını alır ve bunları desen işleyici nesnesine geçirir. Desen işleyicisi daha sonra özel denetim deseni için sağlayıcı arabiriminde uygun yöntemleri çağırır.

Özel denetim desenini kaydeden kod, desen işleyici nesnesini oluşturur ve denetim desenini kaydederken UI Otomasyonu'na nesnenin IUIAutomationPatternHandler arabirimine yönelik bir işaretçi sağlar.

Aşağıdaki diyagramda bir istemci özellik isteğinin veya yöntem çağrısının istemci sarmalayıcısından, UI Otomasyonu çekirdek bileşenleri aracılığıyla desen işleyicisine ve ardından sağlayıcı arabirimine nasıl aktığı gösterilmektedir.

diyagramı, istemci sarmalayıcıdan kalıp işleyicisine ve sağlayıcı akışı gösteriyor.

İstemci sarmalayıcısı ve desen işleyicisi arabirimlerini uygulayan nesnelerin serbest iş parçacıklı olması gerekir. Ayrıca, UI Otomasyonu çekirdeğinin herhangi bir ara hazırlama kodu olmadan nesneleri doğrudan çağırabilmesi gerekir.

İstemci Sarmalayıcıyı Uygulama

İstemci sarmalayıcı, istemcinin özel denetim deseni tarafından desteklenen özellikleri istemek ve yöntemleri çağırmak için kullandığı bir IXxxPattern arabirimini kullanıma sunan bir nesnedir. Arabirim, desteklenen her özellik (get_CurrentXxx ve get_CachedXxx yöntemi) için bir çift "getter" yönteminden ve desteklenen her yöntem için bir "çağıran" yönteminden oluşur. Nesne örneklendirildiğinde, nesne oluşturucu, UI Automation çekirdeği tarafından uygulanan IUIAutomationPatternInstance arabirimine bir işaretçi alır. IXxxPattern arabiriminin yöntemleri, özellik isteklerini ve yöntem çağrılarını UI Otomasyonu çekirdeğine iletmek için IUIAutomationPatternInstance::GetPropertyve CallMethod yöntemlerinikullanır.

Aşağıdaki örnek, tek bir özelliği destekleyen basit bir özel denetim deseni için istemci sarmalayıcı nesnesinin nasıl uygulandığını gösterir. Daha karmaşık bir örnek için bkz. Özel Denetim DeseniÖrnek Uygulaması.

// Define the client interface.
interface __declspec(uuid("c78b266d-b2c0-4e9d-863b-e3f74a721d47"))
IMyCustomPattern : public IUnknown
{
    STDMETHOD (get_CurrentIsReadOnly)(BOOL * pIsReadOnly) = 0;
    STDMETHOD (get_CachedIsReadOnly)(BOOL * pIsReadOnly) = 0;
};

// Implement the client wrapper class.
class CMyValuePatternClientWrapper :
    public IMyCustomPattern
{
    IUIAutomationPatternInstance * _pInstance;
    
public:
    // Get IUIAutomationPatternInstance interface pointer from the
    // UI Automation core.
    CMyValuePatternClientWrapper(IUIAutomationPatternInstance * pInstance)
        : _pInstance(pInstance)
    {
        _pInstance->AddRef();
    }
    
    ~CMyValuePatternClientWrapper()
    {
        _pInstance->Release();
    }

    // Note: Put standard IUnknown implementation here.

    STDMETHODIMP get_CurrentIsReadOnly(BOOL * pIsReadOnly)
    {
        return _pInstance->GetProperty(0, FALSE, UIAutomationType_Bool, pIsReadOnly);
    }

    STDMETHODIMP get_CachedIsReadOnly(BOOL * pIsReadOnly)
    {
        return _pInstance->GetProperty(0, TRUE, UIAutomationType_Bool, pIsReadOnly);
    }
};

Desen İşleyicisini Uygulama

Desen işleyicisi, IUIAutomationPatternHandler arabirimini uygulayan bir nesnedir. Bu arabirimin iki yöntemi vardır: IUIAutomationPatternHandler::CreateClientWrapper ve Dispatch. CreateClientWrapper yöntemi UI Otomasyonu çekirdeği tarafından çağrılır ve IUIAutomationPatternInstance arabirimine yönelik bir işaretçi alır. CreateClientWrapper, istemci sarmalayıcı nesnesinin örneğini oluşturarak ve IUIAutomationPatternInstance arabirim işaretçisini istemci sarmalayıcı oluşturucusunun içine geçirerek yanıt verir.

Dispatch yöntemi, özel denetim deseni için özellik isteklerini ve yöntem çağrılarını sağlayıcı arabirimine geçirmek için UI Otomasyonu çekirdeği tarafından kullanılır. Parametreler arasında sağlayıcı arabirimine yönelik bir işaretçi, çağrılan özellik alıcısının veya yönteminin sıfır tabanlı dizini ve sağlayıcıya geçirilmekte olan parametreleri içeren UIAutomationParameter yapıları dizisi bulunur. Desen işleyicisi, çağrılacak sağlayıcı yöntemini belirlemek için dizin parametresini denetleyerek yanıt verir ve ardından UIAutomationParameter yapılarında bulunan parametreleri geçirerek bu sağlayıcı arabirimini çağırır.

Desen işleyici nesnesi, özel denetim desenini kaydeden kod tarafından, denetim deseni kaydedilmeden önce örneklenir. Kod, desen işleyici nesnesinin IUIAutomationPatternHandler arabirim işaretçisini kayıt zamanında UI Otomasyonu çekirdeğine geçirmelidir.

Aşağıdaki örnek, tek bir özelliği destekleyen basit bir özel denetim deseni için desen işleyici nesnesinin nasıl uygulandığını gösterir. Daha karmaşık bir örnek için bkz. Özel Denetim DeseniÖrnek Uygulaması.

// Define the provider interface.
interface __declspec(uuid("9f5266dd-f0ab-4562-8175-c383abb2569e"))
IMyValueProvider : public IUnknown
{
    STDMETHOD (get_IsReadOnly)(BOOL * pIsReadOnly) = 0;
};            

// Index used by IUIAutomationPatternHandler::Dispatch.
const int MyValue_GetIsReadOnly = 0; 
            
// Define the pattern handler class.        
class CMyValuePatternHandler : public IUIAutomationPatternHandler
{
public:
    
    // Put standard IUnknown implementation here.

    STDMETHODIMP CreateClientWrapper(
            IUIAutomationPatternInstance * pPatternInstance, 
            IUnknown ** pClientWrapper)
    {
        *pClientWrapper = new CMyValuePatternClientWrapper(pPatternInstance);
        if (*pClientWrapper == NULL)
            return E_INVALIDARG;
        return S_OK;
    }
    
    STDMETHODIMP Dispatch (IUnknown * pTarget, UINT index, 
            const struct UIAutomationParameter *pParams, UINT cParams)
    {
        switch(index)
        {
        case MyValue_GetIsReadOnly:
            return ((IMyValueProvider*)pTarget)->get_IsReadOnly((BOOL*)pParams[0].pData);
        }
        return E_INVALIDARG;
    }
};

Özel Denetim Deseni Kaydetme

Kullanılabilmesi için önce özel denetim deseninin hem sağlayıcı hem de istemci tarafından kaydedilmesi gerekir. Kaydetme, UI Otomasyonu çekirdeğine denetim deseni hakkında ayrıntılı bilgiler sağlar ve sağlayıcıya veya istemciye denetim deseni kimliğini ve denetim deseni tarafından desteklenen özellikler ve olaylar için kimlikleri sağlar. Sağlayıcı tarafında, ilişkili denetim WM_GETOBJECT iletisini işlemeden önce veya aynı anda özel denetim deseninin kaydedilmesi gerekir.

Özel denetim deseni kaydederken, sağlayıcı veya istemci aşağıdaki bilgileri sağlar:

  • Özel denetim deseninin GUID'i.
  • Özel denetim deseninin adını içeren, bulunamaz bir dize.
  • Özel denetim desenini destekleyen sağlayıcı arabiriminin GUID'i.
  • Özel denetim desenini destekleyen istemci arabiriminin GUID'i.
  • Özel denetim deseni tarafından desteklenen özellikleri açıklayan UIAutomationPropertyInfo yapıları dizisi. Her özellik için GUID, özellik adı ve veri türü belirtilmelidir.
  • Özel denetim deseni tarafından desteklenen yöntemleri açıklayan UIAutomationMethodInfo yapıları dizisi. Her yöntem için yapı şu bilgileri içerir: yöntem adı, parametre sayısı, parametre veri türlerinin listesi ve parametre adlarının listesi.
  • Özel denetim deseni tarafından tetiklenen olayları açıklayan UIAutomationEventInfo yapıları dizisi. Her olay için GUID ve olay adı belirtilmelidir.
  • IUIAutomationPatternHandler özel denetim desenini istemciler için kullanılabilir hale getiren desen işleyici nesnesinin arabiriminin adresi.

Özel denetim desenini kaydetmek için sağlayıcının veya istemci kodunun aşağıdaki adımları gerçekleştirmesi gerekir:

  1. UIAutomationPatternInfo yapısını önceki bilgilerle doldurun.
  2. CUIAutomationRegistrar nesnesinin bir örneğini oluşturmak ve nesnenin IUIAutomationRegistrar arabirimine bir işaretçi almak için CoCreateInstance işlevini kullanın.
  3. UIAutomationPatternInfo yapısının adresini geçirerek IUIAutomationRegistrar::RegisterPattern yöntemini çağırın.

RegisterPattern yöntemi, özellik kimliklerinin ve olay kimliklerinin listesinin yanı sıra kontrol deseni kimliği döndürür. Bir uygulama bu kimlikleri, böyle bir tanımlayıcıyı parametre olarak alan herhangi bir UI Otomasyonu yöntemine geçirebilir. Örneğin, bir denetim deseninin sağlayıcı arabirimine işaretçi almak için kayıtlı bir desen kimliğini IUIAutomationElement::GetCurrentPattern yöntemine geçirebilirsiniz.

Özel denetim düzeninin kaydını kaldıran bir yöntem yoktur. Bunun yerine, son UI Otomasyonu nesnesi serbest bırakıldığında örtük olarak kaydı kaldırılır.

Özel denetim deseninin nasıl kaydedildiğini gösteren bir örnek için aşağıdaki bölüme bakın.

Özel Denetim Deseninin Örnek Uygulaması

Bu bölüm, özel denetim deseni için istemci sarmalayıcı ve desen işleyici nesnelerinin nasıl uygulandığını gösteren örnek kod içerir. Örnek, Değer denetim desenini temel alan özel bir denetim deseni uygular.

// Step 1: Define the public provider and client interfaces using IDL. Interface 
// definitions are in C here to simplify the example.

// Define the provider interface.
interface __declspec(uuid("9f5266dd-f0ab-4562-8175-c383abb2569e"))
IMyValueProvider : public IUnknown
{
    STDMETHOD (get_Value)(BSTR * pValue) = 0;
    STDMETHOD (get_IsReadOnly)(BOOL * pIsReadOnly) = 0;
    STDMETHOD (SetValue)(LPCWSTR pNewValue) = 0;
    STDMETHOD (Reset)() = 0;
};

// Define the client interface.
interface __declspec(uuid("103b8323-b04a-4180-9140-8c1e437713a3"))
IUIAutomationMyValuePattern : public IUnknown
{
    STDMETHOD (get_CurrentValue)(BSTR * pValue) = 0;
    STDMETHOD (get_CachedValue)(BSTR * pValue) = 0;

    STDMETHOD (get_CurrentIsReadOnly)(BOOL * pIsReadOnly) = 0;
    STDMETHOD (get_CachedIsReadOnly)(BOOL * pIsReadOnly) = 0;

    STDMETHOD (SetValue)(LPCWSTR pNewValue) = 0;
    STDMETHOD (Reset)() = 0;
};

// Enumerate the properties and methods starting from 0, and placing the 
// properties first. 
enum
{
    MyValue_GetValue = 0,
    MyValue_GetIsReadOnly = 1,
    MyValue_SetValue = 2,
    MyValue_Reset = 3,
};

// Step 2: Implement the client wrapper class.
class CMyValuePatternClientWrapper :
    public IUIAutomationMyValuePattern
{
    IUIAutomationPatternInstance * _pInstance;

public:
    // Get IUIAutomationPatternInstance interface pointer.
    CMyValuePatternClientWrapper(IUIAutomationPatternInstance * pInstance)
    {
        _pInstance = pInstance;
        _pInstance->AddRef();
    }

    // Put standard IUnknown implementation here.

    STDMETHODIMP get_CurrentValue(BSTR * pValue)
    {
        return _pInstance->GetProperty(MyValue_GetValue, FALSE, 
                UIAutomationType_String, pValue);
    }

    STDMETHODIMP get_CachedValue(BSTR * pValue)
    {
        return _pInstance->GetProperty(MyValue_GetValue, TRUE, 
                UIAutomationType_String, pValue);
    }

    STDMETHODIMP get_CurrentIsReadOnly(BOOL * pIsReadOnly)
    {
        return _pInstance->GetProperty(MyValue_GetIsReadOnly, FALSE, 
                UIAutomationType_Bool, pIsReadOnly);
    }

    STDMETHODIMP get_CachedIsReadOnly(BOOL * pIsReadOnly)
    {
        return _pInstance->GetProperty(MyValue_GetIsReadOnly, TRUE, 
                UIAutomationType_Bool, pIsReadOnly);
    }

    STDMETHODIMP SetValue(LPCWSTR pValue)
    {
        UIAutomationParameter SetValueParams[] = 
                { UIAutomationType_String, &pValue };
        return _pInstance->CallMethod(MyValue_SetValue,  SetValueParams, 
                ARRAYSIZE(SetValueParams));
    }

    STDMETHODIMP Reset()
    {
        return _pInstance->CallMethod(MyValue_Reset, NULL, 0);
    }
};

// Step 3: Implement the pattern handler class.
class CMyValuePatternHandler : public IUIAutomationPatternHandler
{
public:

    // Put standard IUnknown implementation here.
    
    STDMETHODIMP CreateClientWrapper(
            IUIAutomationPatternInstance * pPatternInstance, 
            IUnknown ** pClientWrapper)
    {
        *pClientWrapper = new CMyValuePatternClientWrapper(pPatternInstance);
        if (*pClientWrapper == NULL)
            return E_INVALIDARG;
        return S_OK;
    }
    
    STDMETHODIMP Dispatch (IUnknown * pTarget, UINT index, 
            const struct UIAutomationParameter *pParams, 
            UINT cParams)
    {
        switch(index)
        {
        case MyValue_GetValue:
            return ((IMyValueProvider*)pTarget)->get_Value((BSTR*)pParams[0].pData);

        case MyValue_GetIsReadOnly:
            return ((IMyValueProvider*)pTarget)->get_IsReadOnly((BOOL*)pParams[0].pData);

        case MyValue_SetValue:
            return ((IMyValueProvider*)pTarget)->SetValue(*(LPCWSTR*)pParams[0].pData);

        case MyValue_Reset:
            return ((IMyValueProvider*)pTarget)->Reset();
        }
        return E_INVALIDARG;
    }
};

CMyValuePatternHandler g_MyValuePatternHandler;

// Step 4: Declare information about the properties and methods supported
// by the custom control pattern.

// Define GUIDs for the custom control pattern and each of its properties 
// and events.
static const GUID MyValue_Pattern_Guid = { 0xa49aa3c0, 0xe413, 0x4ecf, 
        { 0xa1, 0xc3, 0x37, 0x42, 0xa7, 0x86, 0x67, 0x3f } };
static const GUID MyValue_Value_Property_Guid = { 0xe58f3f67, 0x22c7, 0x44f0, 
        { 0x83, 0x55, 0xd8, 0x76, 0x14, 0xa1, 0x10, 0x81 } };
static const GUID MyValue_IsReadOnly_Property_Guid = { 0x480540f2, 0x9829, 0x4acd, 
        { 0xb8, 0xea, 0x6e, 0x2a, 0xdc, 0xe5, 0x3a, 0xfb } };
static const GUID MyValue_Reset_Event_Guid = { 0x5b80edd3, 0x67f, 0x4a70, 
        { 0xb0, 0x7, 0x4, 0x12, 0x85, 0x11, 0x1, 0x7a } };

// Declare information about the properties, in the same order as the
// previously defined "MyValue_" enumerated type.
UIAutomationPropertyInfo g_MyValueProperties[] = 
{
    // GUID, name, data type.
    { MyValue_Value_Property_Guid, L"MyValuePattern.Value", 
                                                    UIAutomationType_String },
    { MyValue_IsReadOnly_Property_Guid, L"MyValuePattern.IsReadOnly", 
                                                    UIAutomationType_Bool },
};

// Declare information about the event.
UIAutomationEventInfo g_MyValueEvents [] =
{
    { MyValue_Reset_Event_Guid,  L"MyValuePattern.Reset" },
};

// Declare the data type and name of the SetValue method parameter. 
UIAutomationType g_SetValueParamTypes[] = { UIAutomationType_String };
LPCWSTR g_SetValueParamNames[] = {L"pNewValue"};

// Declare information about the methods.
UIAutomationMethodInfo g_MyValueMethods[] =
{
    // Name, focus flag, count of in parameters, count of out parameters, types, parameter names.
    { L"MyValuePattern.SetValue", TRUE, 1, 0, g_SetValueParamTypes, g_SetValueParamNames },
    { L"MyValuePattern.Reset", TRUE, 0, 0, NULL, NULL },
};

// Declare the custom control pattern using the previously defined information.
UIAutomationPatternInfo g_ValuePatternInfo =
{
    MyValue_Pattern_Guid,
    L"MyValuePattern",
    __uuidof(IMyValueProvider),
    __uuidof(IUIAutomationMyValuePattern),
    ARRAYSIZE(g_MyValueProperties), g_MyValueProperties, // properties
    ARRAYSIZE(g_MyValueMethods), g_MyValueMethods,       // methods
    ARRAYSIZE(g_MyValueEvents), g_MyValueEvents,         // events 
    &g_MyValuePatternHandler
};

// Step 5: Register the custom control pattern and retrieve the control pattern and property 
// identifiers.

// Control pattern, property, and event IDs.
PATTERNID  g_MyValue_PatternID;
PROPERTYID g_MyValue_Value_PropertyID;
PROPERTYID g_MyValue_IsReadOnly_PropertyID;
EVENTID    g_MyValueReset_EventID;

// ID used by the client to determine whether the custom control pattern is available.
PROPERTYID g_IsMyValuePatternAvailable_PropertyID;

HRESULT RegisterPattern()
{
    // Create the registrar object and get the IUIAutomationRegistrar interface pointer. 
    IUIAutomationRegistrar * pUIARegistrar;
    CoCreateInstance(CLSID_CUIAutomationRegistrar, NULL, CLSCTX_INPROC_SERVER, 
            IID_IUIAutomationRegistrar, (void **)&pUIARegistrar);

    if (pUIARegistrar == NULL)
        return E_NOINTERFACE;

    PROPERTYID propIDs[2]; // Array for property IDs.

    // Register the control pattern.
    HRESULT hr = pUIARegistrar->RegisterPattern(
        &g_ValuePatternInfo,
        &g_MyValue_PatternID,
        &g_IsMyValuePatternAvailable_PropertyID,
        ARRAYSIZE(propIDs), 
        propIDs,
        1,
        &g_MyValueReset_EventID);
            
    if (hr == S_OK)
    {
        // Copy the property IDs.
        g_MyValue_Value_PropertyID = propIDs[0];
        g_MyValue_IsReadOnly_PropertyID = propIDs[1];
    }

    pUIARegistrar->Release();
    return hr;
}

kavramsal

Özel Özellikler, Olaylar ve Denetim Desenleri Tasarlama

UI Otomasyonu Özelliklerine Genel Bakış

UI Otomasyonu Olaylarına Genel Bakış

UI Otomasyonu Denetim Desenlerine Genel Bakış