我正在尝试编写一个dll来在Windows 7中注入全局鼠标钩子。它基本上可以工作,但是在几秒钟之后(可能是10到15)整个应用程序就会冻结,鼠标不能在Visual Studio外工作(我仍然可以通过vs停止应用程序,但没有其他任何东西(比如使用任务管理器来执行)。
我一直在寻找一段时间,但我无法找到问题的答案。我已经将我的dll减少到最低限度(安装鼠标钩而不用它做任何事情)但它仍然会发生。
头
#ifndef MOUSE_HOOK_WINDOWS_H
#define MOUSE_HOOK_WINDOWS_H
#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif
#pragma data_seg(".mouseHookSharedMemory")
HHOOK g_hMouseHook = NULL;
HINSTANCE g_hInst = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.mouseHookSharedMemory,RWS")
extern "C"
{
DECLDIR BOOL InstallHook();
DECLDIR BOOL UninstallHook();
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
}
#endif
CPP
#include <Windows.h>
#include "MouseHookWindows.h"
#include <sstream>
extern "C"
{
DECLDIR BOOL InstallHook()
{
if(g_hMouseHook != NULL)
{
return true;
}
g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0);
if(g_hMouseHook == NULL)
{
return false;
}
return true;
}
DECLDIR BOOL UninstallHook()
{
if(g_hMouseHook != NULL)
{
UnhookWindowsHookEx(g_hMouseHook);
g_hMouseHook = NULL;
}
return true;
}
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}
}
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD reason, LPVOID reserved)
{
g_hInst = hInstance;
return true;
}
没有例外或任何事情。该应用程序冻结,除了视觉工作室之外的一切都不再对鼠标做出反应(如前所述,甚至不是任务管理员)
我不知道它是否重要,但我在c ++控制台应用程序中使用了dll。
提前致谢 曼努埃尔
答案 0 :(得分:0)
user2802841是对的,问题是缺少消息循环。在控制台应用程序中使用鼠标钩子(WH_MOUSE或WH_MOUSE_LL)时,必须在应用程序的某处调用getMessage或peekMessage。