0

Windows 7 でグローバル マウス フックを挿入する dll を作成しようとしています。基本的には動作しますが、数秒後 (おそらく 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 を使用しています。

前もってありがとうマヌエル

4

1 に答える 1

0

user2802841 は正しく、問題はメッセージ ループの欠落でした。コンソール アプリケーションでマウス フック (WH_MOUSE または WH_MOUSE_LL) を使用する場合、アプリケーションのどこかでgetMessageまたはpeekMessageを呼び出す必要があります。

于 2013-12-25T13:19:32.370 に答える