Visual Studio 2012 — глобальный хук мыши вызывает сбой приложения (c ++ / windows7)

Я пытаюсь написать 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

0

Решение

user2802841 был прав, проблема была в пропущенном цикле сообщений. При использовании мыши (WH_MOUSE или WH_MOUSE_LL) в консольном приложении GetMessage или же PeekMessage должны быть вызваны где-то в приложении.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]