C++ SetWinEventHook проблема с 32- и 64-разрядными приложениями

Я пытаюсь подключить виноделы, такие как EVENT_SYSTEM_MOVESIZESTART и EVENT_SYSTEM_MOVESIZEEND, ко всем окнам рабочего стола. Для этого я использовал SetWinEventHook(). Вот мой пример кода.

    BOOL DlmSetEventHook()
    {
    if (hInstance == NULL)
        return FALSE;
    CoInitialize(NULL);
    hWEventHook = SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, NULL, WinEventProc, NULL, NULL, WINEVENT_OUTOFCONTEXT );
    if ( hWEventHook == NULL )
    {
        return FALSE;
    }
    return TRUE;
    }

Это часть установленного крючка.

void DlmRemoveEventHook()
{
    WaitForSingleObject(hWEventHook, INFINITE);
    UnhookWinEvent(hWEventHook);
    CoUninitialize();
}

Выше для удаления WinEvent Hook.

И это функция HookProc.

void CALLBACK WinEventProc(
    HWINEVENTHOOK hWinEventHook,
    DWORD         event,
    HWND          hwnd,
    LONG          idObject,
    LONG          idChild,
    DWORD         dwEventThread,
    DWORD         dwmsEventTime
)
{
IAccessible* pAcc = NULL;
VARIANT varChild;
HRESULT hr = AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild);

if ((hr == S_OK) && (pAcc != NULL))
{
    if (event == EVENT_SYSTEM_MOVESIZESTART)
    {
        if (!(::GetWindowLong(hPaneWnd, GWL_STYLE) & WS_VISIBLE))
        {
            ::ShowWindow(hPaneWnd, SW_SHOWNOACTIVATE);
            ::UpdateWindow(hPaneWnd);
        }

    }

    if (event == EVENT_SYSTEM_MOVESIZEEND)
    {
        if ((::GetWindowLong(hPaneWnd, GWL_STYLE) & WS_VISIBLE))
        {
            ::ShowWindow(hPaneWnd, SW_HIDE);
        }
    }
    pAcc->Release();
}
}

Все приведенные выше коды находятся в DLL. И я скомпилировал DLL с методом отладки x86. И я, конечно, скомпилировал клиентский проект с методом отладки x86. Моя проблема заключается в том, что этот hookproc прослушивает события, вызванные только в 64-битных приложениях (я использую Win10 x64). Он не может слушать Winevents x86-битных приложений. Я только знаю, что 32-битная DLL может быть введена только в 32-битный проект и то же самое на 64-битной DLL. Но я думаю, что это не связано с Winevent Hook. Что не так в моем коде? А что я никогда не знаю?

0 ответов

Другие вопросы по тегам