잠시 동안 완벽하게 작동하는 WM_MOUSE에 전역 훅을 정의했습니다. 마우스를 움직일 때마다 특정 창에 메시지를 게시합니다.잠시 후 SetWindowsHook이 작동을 멈 춥니 다.
임의의 시간이 지나면 후크가 메시지를 보내지 않습니다. 등록을 취소하고 연결 고리를 등록하면 다시 작동합니다. 나는 Windows에서 일어나는 어떤 특정한 일이 후크를 멈추게 할 것이라고 생각하지만, 나는 무엇을 찾을 수 없다.
아이디어가 있으십니까?
편집 : 후크가 더 이상 활성화되어 있지 않을 때 디버거를 다른 프로세스에 연결하고 dll이 더 이상로드되지 않는 것을 관찰했습니다.
후크 dll을 언로드시킬 수있는 원인은 무엇입니까?
Edit2가 : 나는 MouseHookProc에서 충돌이 모든 프로세스에 DLL이이에 장전 모든 프로세스에서 후크 DLL을 언로드 것을 알아 내 코드에서 충돌로 원인을 찾을 수 없습니다.. 경주 조건이 될지도 모릅니다. 다음은 DLL 코드입니다.
#include "stdafx.h"
// define a data segment
#pragma data_seg(".SHARED")
HWND hwnd=0;
HHOOK hHook=0;
#pragma data_seg()
// tell the linker to share the segment
#pragma comment(linker, "/section:.SHARED,RWS")
#define WM_MOUSEHOOK WM_USER+0x100
HINSTANCE hInstance=0;
// this allow to build a very small executable without any extra libraries
// (probably not the problem, the bug still occurs without this)
#ifndef _DEBUG
void *__cdecl operator new(unsigned int bytes)
{
return HeapAlloc(GetProcessHeap(), 0, bytes);
}
void __cdecl operator delete(void *ptr)
{
if(ptr) HeapFree(GetProcessHeap(), 0, ptr);
}
extern "C" int __cdecl __purecall(void)
{
return 0;
}
#endif
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
hInstance=hModule;
return TRUE;
}
LRESULT CALLBACK MouseHookProc(int nCode, WORD wParam, DWORD lParam)
{
if(nCode==HC_ACTION && (wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE))
{
MSLLHOOKSTRUCT *mhs=(MSLLHOOKSTRUCT*)lParam;
PostMessage(hwnd, WM_MOUSEHOOK, wParam, 0);
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
extern "C" __declspec(dllexport) HHOOK InitializeWindowsHook(char *title)
{
hwnd=FindWindow(0, title);
if(hwnd)
hHook=SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, hInstance, 0);
return hHook;
}
extern "C" __declspec(dllexport) BOOL DeinitializeWindowsHook()
{
if(hHook) {
BOOL b=UnhookWindowsHookEx(hHook);
hHook=0;
return b;
}
return FALSE;
}
메시지를 체인의 다른 후크에 전파하고 있습니까? – rpg
'WH_MOUSE' 훅이있는 동안'MOUSEHOOKSTRUCT' 구조체 대신에'MSLLHOOKSTRUCT'를 사용하는 것으로 나타났습니다. –
실제로'* mhs '를 선언했지만 사용하지는 않습니다. –