Я пытаюсь написать 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;
}
Никакого исключения или чего-то еще. Приложение зависает, и все, кроме визуальной студии, больше не реагирует на мышь (как говорилось ранее, даже диспетчер задач)
Я не знаю, важно ли это, но я использую dll в консольном приложении c++.
Заранее спасибо Мануэль
user2802841 был прав, проблема заключалась в отсутствии пропущенного цикла сообщений. При использовании крючка мыши (WH_MOUSE или WH_MOUSE_LL) в консольном приложении getMessage или peekMessage должны быть вызваны где-то в приложении.