gpt4 book ai didi

c++ - SetWindowsHookex 在一段时间后停止工作

转载 作者:可可西里 更新时间:2023-11-01 13:30:52 26 4
gpt4 key购买 nike

我在 WM_MOUSE 上定义了一个全局钩子(Hook),它可以完美运行一段时间。每次鼠标移动时,它都会向特定窗口发送一条消息。

在某个随机时间后, Hook 停止发送消息。如果我注销并注册 Hook ,它会再次运行。我想 Windows 中发生的某些特定事件会导致 Hook 停止,但我找不到是什么。

有什么想法吗?

编辑:当 Hook 不再事件时,我将调试器附加到其他进程,并且我观察到 dll 不再加载。

什么会导致 Hook dll 卸载?

Edit2 :我发现任何进程中的 MouseHookProc dll 崩溃都会从它加载的每个进程中卸载 hook dll。我在我的代码中找不到崩溃的原因。可能是某种竞争条件或其他什么?这是 Hook 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;
}

最佳答案

你有没有检查过,如果钩子(Hook)不再被调用时是否仍然安装(即检查 BOOL UnhookWindowsHook 的返回值)?

可能安装了另一个 Hook ,它不会保留您的 Hook ,不会调用 CallNextHookEx()。

关于c++ - SetWindowsHookex 在一段时间后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1465112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com