我把钩子相关的做成一个类库项目,再用其他FORM项目用这个类库,键盘和鼠标钩子可以有全局钩子,但是WH_CBT就是不行,怎么实现CBT或者SHELL的全局钩子?

解决方案 »

  1.   

    #include "windows.h"
    #pragma data_seg("MySeg")
    HHOOK g_hCbtHook = NULL;
    HANDLE g_hInst = NULL;
    #pragma data_seg()
    #pragma  comment(linker,"/section:MySeg,RWS")
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
                         )
    {
        g_hInst = hModule;
        return TRUE;
    }
    static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        return CallNextHookEx(g_hCbtHook, nCode, wParam, lParam);
    }
    void HookCbt(bool bHook)
    {
        if(bHook)
            g_hCbtHook = SetWindowsHookEx(WH_CBT, CbtHookProc, g_hInst, 0);
        else
            g_hCbtHook ? UnhookWindowsHookEx(g_hCbtHook) : NULL;
    }
      

  2.   


    回调函数是放在dll里的
    Hook.cpp内容如下:C/C++ code
    #include "Hook.h"#pragma data_seg("MySeg")
    HHOOK g_hCbtHook = NULL;
    HWND g_hReceiveWnd = NULL;
    #pragma data_seg()
    #pragma  comment(linker,"/section:MySeg,RWS")// 设置接受消息的窗口
    void SetReceiveWnd(HWND hWnd)
    {
        g_hReceiveWnd=hWnd;
    }
    // 窗口切换钩子回调
    static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        ::SendMessage(g_hReceiveWnd, WM_MY_MESSAGE, (WPARAM)nCode, lParam);
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
    // 开关窗口切换钩子
    bool HookCbt(bool bHook)
    {
        if(bHook)
        {
            g_hCbtHook = ::SetWindowsHookEx(WH_CBT, CbtHookProc, GetModuleHandle(NULL), 0);
            return g_hCbtHook ? true : false;
        }
        else
        {
            g_hCbtHook ? UnhookWindowsHookEx(g_hCbtHook) : NULL;
            g_hCbtHook = NULL;
            return true;
        }
    }
    Hook.h内容如下:C/C++ code
    #pragma once#include "windows.h"#define WM_MY_MESSAGE WM_USER + 1// 设置接受消息的窗口
    void SetReceiveWnd(HWND hWnd);
    // 窗口切换钩子回调
    static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam);
    // 开关窗口切换钩子
    bool HookCbt(bool bHook);
    Hook.def内容如下:C/C++ code
    LIBRARY    "Hook"EXPORTS
    SetReceiveWnd    @2
    HookCbt            @3
      

  3.   

    全局钩子必须是DLL,建议你用VC来写吧。
      

  4.   

    http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx
    这个解决问题.
      

  5.   

    只能先用VC做一个DLL项目,然后再用C#使用了