Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
全局鼠标挂钩导致应用程序崩溃(c++/windows7)_C++_Visual Studio 2012_Windows 7_Crash_Mouse Hook - Fatal编程技术网

全局鼠标挂钩导致应用程序崩溃(c++/windows7)

全局鼠标挂钩导致应用程序崩溃(c++/windows7),c++,visual-studio-2012,windows-7,crash,mouse-hook,C++,Visual Studio 2012,Windows 7,Crash,Mouse Hook,我正在尝试编写一个dll,以便在Windows7中插入一个全局鼠标挂钩。它基本上是可以工作的,但是在10-15秒之后,整个应用程序就冻结了,鼠标在VisualStudio之外无法工作。我仍然可以通过vs停止应用程序,但没有其他方法可以像使用任务管理器那样 我已经找了一段时间了,但我真的找不到问题的答案。我已经将我的dll缩减到最低限度,不做任何操作就安装鼠标挂钩,但它仍然会发生 标题 #ifndef MOUSE_HOOK_WINDOWS_H #define MOUSE_HOOK_WINDOWS_

我正在尝试编写一个dll,以便在Windows7中插入一个全局鼠标挂钩。它基本上是可以工作的,但是在10-15秒之后,整个应用程序就冻结了,鼠标在VisualStudio之外无法工作。我仍然可以通过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

没有例外或任何事情。应用程序冻结,除了VisualStudio之外的所有东西都不会像前面所说的那样对鼠标做出反应,甚至任务管理器也不会

我不知道它是否重要,但是我在一个C++控制台应用程序中使用了DLL。 提前谢谢
Manuel

user2802841是正确的,问题是缺少消息循环。当在控制台应用程序中使用鼠标钩子WH_mouse或WH_mouse_LL时,或者必须在应用程序中的某个位置调用鼠标钩子。

安装钩子的进程应该有一个有效的消息循环,或者它可以冻结所有挂接的应用程序,也许这就是问题所在?您的DllMain已损坏,它会将g_hMouseHook设置回NULL。不要忽略原因。@HansPassant好的,谢谢,我更改了它,也编辑了上面的代码,但我仍然得到与以前相同的行为。@user2802841这不是只用于低级鼠标挂钩吗?在这种情况下,循环会在哪里?在dll中,或在使用dll的应用程序中?下一个错误是pragma data_seg,您让每个dll覆盖其他dll的句柄。只共享您自己的数据。
#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;
}