【问题标题】:global mouse hook causes application crash (c++ / windows7)全局鼠标钩子导致应用程序崩溃(c++ / windows 7)
【发布时间】:2014-01-11 03:33:50
【问题描述】:

我正在尝试编写一个 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 之外的所有内容都不再对鼠标做出反应(如前所述,甚至任务管理器也没有)

我不知道它是否重要,但我在 c++ 控制台应用程序中使用 dll。

提前致谢 曼努埃尔

【问题讨论】:

  • 安装钩子的进程应该有一个有效的消息循环或者它可以冻结所有被钩子的应用程序,也许这就是问题?
  • 你的 DllMain() 坏了,它把 g_hMouseHook 设置回 NULL。不要忽视原因
  • @HansPassant 对,谢谢,我改变了它(也编辑了上面的代码),但我仍然得到与以前相同的行为。
  • @user2802841 这不只适用于低级鼠标挂钩(WH_MOUSE_LL)吗?在这种情况下,循环在哪里?在 dll 中,还是在使用 dll 的应用程序中?
  • 下一个错误是#pragma data_seg,您让每个DLL 覆盖其他的句柄。只分享您自己的数据。

标签: c++ visual-studio-2012 windows-7 crash mouse-hook


【解决方案1】:

user2802841 是对的,问题是缺少消息循环。在控制台应用程序中使用鼠标钩子(WH_MOUSE 或 WH_MOUSE_LL)时,getMessagepeekMessage 必须在应用程序的某处调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多