UIAutomation:AddAutomationEventHandler()返回E_INVALIDARG

时间:2019-04-22 06:16:26

标签: c++ winapi ui-automation

这是我的代码:

select D.SCHOOL_NAME
        ,A.SYMBOL_NO
        ,B.STUDENT_NAME         
        ,B.GENDER
        ,A.AVG_GPA
    FROM TBL_STD_MARKS A
    INNER JOIN TBL_STD_INFO B ON A.SYMBOL_NO = B.SYMBOL_NO
    INNER JOIN TBL_SCHOOL D ON A.SCHOOL_ID = D.SCHOOL_ID
where B.GENDER='M' OR B.GENDER='F' and A.AVG_GPA=(select max(AVG_GPA) from TBL_STD_MARKS)

此代码来自Microsoft的有关为UIAutomation实现Event类的示例。

我对代码进行了一些编辑,以便它可以支持Focus事件,但是尝试初始化一行代码失败。

我不明白为什么// Defines an event handler for general UI Automation events. It listens for // tooltip and window creation and destruction events. #include <windows.h> #include <stdio.h> #include <UIAutomation.h> class EventHandler : public IUIAutomationEventHandler { private: LONG _refCount; public: int _eventCount; // Constructor. EventHandler() : _refCount(1), _eventCount(0) { } // IUnknown methods. ULONG STDMETHODCALLTYPE AddRef() { ULONG ret = InterlockedIncrement(&_refCount); return ret; } ULONG STDMETHODCALLTYPE Release() { ULONG ret = InterlockedDecrement(&_refCount); if (ret == 0) { delete this; return 0; } return ret; } HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppInterface) { if (riid == __uuidof(IUnknown)) *ppInterface = static_cast<IUIAutomationEventHandler*>(this); else if (riid == __uuidof(IUIAutomationEventHandler)) *ppInterface = static_cast<IUIAutomationEventHandler*>(this); else { *ppInterface = NULL; return E_NOINTERFACE; } this->AddRef(); return S_OK; } // IUIAutomationEventHandler methods HRESULT STDMETHODCALLTYPE HandleAutomationEvent(IUIAutomationElement * pSender, EVENTID eventID) { _eventCount++; switch (eventID) { case UIA_AutomationFocusChangedEventId: wprintf(L">> Event FocusChanged Received! (count: %d)\n", _eventCount); break; case UIA_ToolTipOpenedEventId: wprintf(L">> Event ToolTipOpened Received! (count: %d)\n", _eventCount); break; case UIA_ToolTipClosedEventId: wprintf(L">> Event ToolTipClosed Received! (count: %d)\n", _eventCount); break; case UIA_Window_WindowOpenedEventId: wprintf(L">> Event WindowOpened Received! (count: %d)\n", _eventCount); break; case UIA_Window_WindowClosedEventId: wprintf(L">> Event WindowClosed Received! (count: %d)\n", _eventCount); break; default: wprintf(L">> Event (%d) Received! (count: %d)\n", eventID, _eventCount); break; } return S_OK; } }; int main(int argc, char* argv[]) { HRESULT hr; int ret = 0; IUIAutomationElement* pTargetElement = NULL; EventHandler* pEHTemp = NULL; CoInitializeEx(NULL, COINIT_MULTITHREADED); IUIAutomation* pAutomation = NULL; hr = CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER, __uuidof(IUIAutomation), (void**)&pAutomation); if (FAILED(hr) || pAutomation == NULL) { ret = 1; goto cleanup; } // Use root element for listening to window and tooltip creation and destruction. hr = pAutomation->GetRootElement(&pTargetElement); if (FAILED(hr) || pTargetElement == NULL) { ret = 1; goto cleanup; } pEHTemp = new EventHandler(); if (pEHTemp == NULL) { ret = 1; goto cleanup; } wprintf(L"-Adding Event Handlers.\n"); hr = pAutomation->AddAutomationEventHandler(UIA_ToolTipOpenedEventId, pTargetElement, TreeScope_Subtree, NULL, (IUIAutomationEventHandler*)pEHTemp); if (FAILED(hr)) { ret = 1; goto cleanup; } hr = pAutomation->AddAutomationEventHandler(UIA_ToolTipClosedEventId, pTargetElement, TreeScope_Subtree, NULL, (IUIAutomationEventHandler*)pEHTemp); if (FAILED(hr)) { ret = 1; goto cleanup; } hr = pAutomation->AddAutomationEventHandler(UIA_Window_WindowOpenedEventId, pTargetElement, TreeScope_Subtree, NULL, (IUIAutomationEventHandler*)pEHTemp); if (FAILED(hr)) { ret = 1; goto cleanup; } hr = pAutomation->AddAutomationEventHandler(UIA_Window_WindowClosedEventId, pTargetElement, TreeScope_Subtree, NULL, (IUIAutomationEventHandler*)pEHTemp); if (FAILED(hr)) { ret = 1; goto cleanup; } // Error is here. hr returns E_INVALIDARG. hr = pAutomation->AddAutomationEventHandler(UIA_AutomationFocusChangedEventId, pTargetElement, TreeScope_Subtree, NULL, (IUIAutomationEventHandler*)pEHTemp); if (FAILED(hr)) { ret = 1; goto cleanup; } wprintf(L"-Press any key to remove event handlers and exit\n"); getchar(); wprintf(L"-Removing Event Handlers.\n"); cleanup: // Remove event handlers, release resources, and terminate if (pAutomation != NULL) { hr = pAutomation->RemoveAllEventHandlers(); if (FAILED(hr)) ret = 1; pAutomation->Release(); } if (pEHTemp != NULL) pEHTemp->Release(); if (pTargetElement != NULL) pTargetElement->Release(); CoUninitialize(); return ret; } 返回E_INVALIDARG。

试图阅读文档,但找不到原因。

请帮助。

1 个答案:

答案 0 :(得分:1)

有一个单独的处理程序,用于处理FocusChangedAddFocusChangedEventHandler,该处理程序应用于监视器焦点更改。由于您尝试发送EventHandler函数指针来处理FocusChanged,因此会出现运行时错误。

要创建该处理程序,需要一个继承自IUIAutomationFocusChangedEventHandler的类的实例。

class FocusChangedEventHandler :
    public IUIAutomationFocusChangedEventHandler
{
private:
    LONG _refCount;

public:
    int _eventCount;

    //Constructor.
    FocusChangedEventHandler() : _refCount(1), _eventCount(0)
    {
    }

    //IUnknown methods.
    ULONG STDMETHODCALLTYPE AddRef()
    {
        ULONG ret = InterlockedIncrement(&_refCount);
        return ret;
    }

    ULONG STDMETHODCALLTYPE Release()
    {
        ULONG ret = InterlockedDecrement(&_refCount);
        if (ret == 0)
        {
            delete this;
            return 0;
        }
        return ret;
    }

    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppInterface)
    {
        if (riid == __uuidof(IUnknown))
            *ppInterface = static_cast<IUIAutomationFocusChangedEventHandler*>(this);
        else if (riid == __uuidof(IUIAutomationFocusChangedEventHandler))
            *ppInterface = static_cast<IUIAutomationFocusChangedEventHandler*>(this);
        else
        {
            *ppInterface = NULL;
            return E_NOINTERFACE;
        }
        this->AddRef();
        return S_OK;
    }

    // IUIAutomationFocusChangedEventHandler methods.
    HRESULT STDMETHODCALLTYPE HandleFocusChangedEvent(IUIAutomationElement * pSender)
    {
        _eventCount++;
        wprintf(L">> FocusChangedEvent Received! (count: %d)\n", _eventCount);
        return S_OK;
    }
};

main()

pFHTemp = new FocusChangedEventHandler();
hr = pAutomation->AddFocusChangedEventHandler(NULL, (IUIAutomationFocusChangedEventHandler*)pFHTemp);
if (FAILED(hr))
{
    ret = 1;
    goto cleanup;
}

摘录自MSDN link

的代码段