c ++ SetWinEventHook与32& 64位应用程序

时间:2017-11-12 16:19:05

标签: c++ winapi dll get-winevent

我正在尝试使用所有桌面窗口挂起EVENT_SYSTEM_MOVESIZESTART和EVENT_SYSTEM_MOVESIZEEND等winevents。 为此,我使用了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;
    }

它是Installed Hook的一部分。

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中。我用x86 Debug方法编译了DLL。 当然,我用x86 Debug方法编译了客户端项目。 我的问题是这个hookproc侦听只在x64位应用程序上引起的事件。(我使用的是Win10 x64)。 它无法监听x86位应用程序的winevents。 我只知道32位dll只能在64位dll上注入32位项目和相同的东西。 但我认为这与winevent hook无关。 我的代码出了什么问题?我永远不知道哪些事情?

0 个答案:

没有答案