我正在尝试使用所有桌面窗口挂起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无关。 我的代码出了什么问题?我永远不知道哪些事情?