मैंने WM_MOUSE पर एक वैश्विक हुक परिभाषित किया जो कुछ समय के लिए पूरी तरह से काम करता है। जब भी माउस चलता है तो यह एक विशिष्ट विंडो में एक संदेश पोस्ट करता है।SetWindowsHook कुछ समय के बाद काम करना बंद कर देता है
कुछ यादृच्छिक समय के बाद हुक संदेश भेजना बंद कर देता है। अगर मैं हुक पंजीकरण और हुक पंजीकृत करता हूं तो यह फिर से काम करता है। मुझे लगता है कि विंडोज़ में होने वाली कुछ विशिष्ट चीज हुक को रोकने का कारण बनती है, लेकिन मुझे वह नहीं मिल रहा है।
कोई विचार?
संपादित करें: जब मैं हुक सक्रिय नहीं होता तब मैंने अन्य प्रक्रियाओं में डीबगर संलग्न किया, और मैंने देखा कि अब डीएलएल लोड नहीं होता है।
क्या हुक डीएलएल को उतारने का कारण बन सकता है?
EDIT2: मुझे लगता है कि MouseHookProc में एक क्रैश किसी भी प्रक्रिया में 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' का उपयोग करते हैं। –
असल में आप '* एमएचएस 'घोषित करते हैं लेकिन आप इसका उपयोग नहीं करते हैं। –