Я пытаюсь написать 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;
}
Там нет исключений или что-нибудь. Приложение зависает и все, кроме visual studio, больше не реагирует на мышь (как уже было сказано, даже на диспетчер задач)
Я не знаю, важно ли это, но я использую dll в консольном приложении c ++.
заранее спасибо
Manuel
user2802841 был прав, проблема была в пропущенном цикле сообщений. При использовании мыши (WH_MOUSE или WH_MOUSE_LL) в консольном приложении GetMessage или же PeekMessage должны быть вызваны где-то в приложении.
Других решений пока нет …