当前位置: 代码迷 >> C# >> 怎么创建一个监听WM_CBT或WM_CREATE的全局勾子程序
  详细解决方案

怎么创建一个监听WM_CBT或WM_CREATE的全局勾子程序

热度:366   发布时间:2016-04-28 08:40:57.0
如何创建一个监听WM_CBT或WM_CREATE的全局勾子程序
本帖最后由 faneok 于 2015-10-27 09:38:33 编辑
RT,
我注册监听键盘和鼠标的勾子没有问题,但是监听全局的WH_CBT就返回0。

以下是我的代码,键盘监听的OK,但是WH_CBT的不行,谁能帮我解决一下:
if (type == HookType.WH_KEYBOARD_LL)
{
    if (kbhHook == 0)//监视输入到线程消息队列中的键盘消息
                {
        kbHook = new HookProc(KeyBoardHookProc);
        kbhHook = SetWindowsHookEx(
            type,
            kbHook,
            GetModuleHandle(
                    Process.GetCurrentProcess().MainModule.ModuleName),
            0
            );
        if (kbhHook == 0)
            UninstallKeyBoardHook();
    }
}
else if (type == HookType.WH_CBT)
{
    if (ethHook == 0)//监视窗口变化消息
    {
        etHook = new HookProc(EventHookProc);
        ethHook = SetWindowsHookEx(
            type,
            etHook,
            GetModuleHandle(
                Process.GetCurrentProcess().MainModule.ModuleName
            ),
            0
        );
        if (ethHook == 0)
        {
            UninstallEventHook();
        }
    }
}

------解决思路----------------------
直接原因是全局钩子(除了WH_KEYBOARD_LL和WH_MOUSE_LL)外,需要加载一个本地dll到目标进程。
而纯C#是不能做本地dll的

另外,钩子是很不好的编程技术,应该尽量避免。