Я пытаюсь подключить виноделы, такие как 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.
Что не так в моем коде? А что я никогда не знаю?
Задача ещё не решена.
Других решений пока нет …