0

我正在尝试将 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;
    }

它是 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 位应用程序的 wineevents。我只知道 32 位 dll 只能注入 32 位项目和 64 位 dll 上的相同内容。但我认为它与wineevent hook无关。我的代码有什么问题?哪些事情我永远不知道?

4

0 回答 0