我正在尝试将 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无关。我的代码有什么问题?哪些事情我永远不知道?