我用的是WH_KEYBOARD参数,,
if(!(hhk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyProc,hInst,0)))
{  //安装钩子     
     return FALSE;
}LRESULT KeyProc(int nCode,WPARAM wParam,LPARAM lParam)
{
   if( wParam == VK_F12 )
    {
   
       UnhookWindowsHookEx(hhk);
     }
     return 1;//也就是屏蔽一切非系统键,,当按F12时解锁,,,但是不行,不知道为什么
              //UnhookWindowsHookEx(hhk);无效,,????????????????????????}   //这些都是在DLL文件里得!!!!!!!!
1.  我上面的程序为什么不能结束钩子!  
2.用钩子的  return  1;屏蔽不料系统键  Alt  Shift  Delete  Win  Tab等等  
   这些系统键,即使我return  1;系统也对它们进行了处理!!  

解决方案 »

  1.   

    将钩子做成dll动态链接库形式即可
      

  2.   

    我是写在DLL里面了,,可是不行啊!!!!
    系统键屏蔽不了啊 !!!!!!
    请支援!!
      

  3.   

    if(!(hhk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyProc,hInst,0)))
    这个不久是全局的么!!???
      

  4.   

    是写在DLL里面的#ifdef HOOK_EXPORTS
    #define HOOK_API __declspec(dllexport)
    #else
    #define HOOK_API __declspec(dllimport)
    #endif// This class is exported from the hook.dll
    class HOOK_API CHook 
    {
    public:
    CHook(void);
    // TODO: add your methods here.
    };HOOK_API BOOL BeginR(); //开始记录按键;
    HOOK_API BOOL StopR(); //结束记录extern HOOK_API int nHook;HOOK_API int fnHook(void);
    #include "stdafx.h"
    #include "hook.h"
    #include "winuser.h"HINSTANCE hInst;
    HHOOK hhk;
    HHOOK hhm;LRESULT KeyProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if( wParam == VK_F12 )
    {
          StopR();

    }
    MessageBeep(-1);
        return 1;}HOOK_API BOOL BeginR()
    {    if(!(hhk=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyProc,hInst,0)))
        {  //安装钩子
            return FALSE;

        }
        return TRUE;
    }HOOK_API BOOL StopR()
    {
        return UnhookWindowsHookEx(hhk);//释放钩子
    }  若有问题请指出,谢谢
      

  5.   

    ////////////////////////////////////////////////
    // 下面的代码表示这一部分在此DLL所有实例之间共享
    // 低级键盘钩子一定是系统级的钩子
    // 
    #pragma data_seg (".mydata")
    HHOOK g_hHookKbdLL = NULL; // 钩子句柄
    BOOL  g_bBeep = FALSE;     // 按下非法键时蜂鸣响铃
    #pragma data_seg ()
    #pragma comment(linker, "/SECTION:.mydata,RWS") // 告诉链接器:建立数据共享段//////////////////////////////////
    // 低级键盘钩子
    // 截获任务转换键:不传递直接返回
    //
    LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp)
    {
       KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;   if (nCode==HC_ACTION) {
          BOOL bCtrlKeyDown =
             GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);      if ((pkh->vkCode==VK_ESCAPE && bCtrlKeyDown) || // Ctrl+Esc
              // Alt+TAB
              (pkh->vkCode==VK_TAB && pkh->flags & LLKHF_ALTDOWN) ||   
              // Alt+Esc
              (pkh->vkCode==VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN)|| 
              (pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN)) { // 开始菜单
             if (g_bBeep && (wp==WM_SYSKEYDOWN||wp==WM_KEYDOWN))
                MessageBeep(0); // 蜂鸣
             return 1; // 不再往CallNextHookEx传递,直接返回
          }
       }
       return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);
    }
      

  6.   

    SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyProc,hInst,0);
    你的参数错了,应该为:
    SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyProc,hInst,0);May you succeed!
      

  7.   

    用系统低级的钩子完成能实现的
    SetWindowsHookEx时用WH_KEYBOARD_LL相应的还有WM_MOUSE_LL
    其他的和正常HOOK一样
    我用它可以屏蔽Alt+Tab
    其他的肯定也是好用的
      

  8.   

    HHOOK SetWindowsHookEx
    ( int idHook,HOOKPROC lpfn, 
    INSTANCE hMod,DWORD dwThreadId   )----参数idHook表示勾子类型,它是和勾子函数类型一一对应的。比如,WH_KEYBOARD表示安装的是键盘勾子,WH_MOUSE表示是鼠标勾子等等。 ----Lpfn是勾子函数的地址。 ----HMod是勾子函数所在的实例的句柄。对于线程勾子,该参数为NULL;对于系统勾子,该参数为勾子函数所在的DLL句柄。 ---- dwThreadId 指定勾子所监视的线程的线程号。对于全局勾子,该参数为NULL。 ----SetWindowsHookEx返回所安装的勾子句柄。 你看看返回是否成功
      

  9.   

    GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);这句话是什么意思!!??
    另外
    WH_KEYBOARD_LL只能在NT上用,,
    是不是只能用这个参数???
    谢谢楼上几位!!!
      

  10.   

    WH_KEYBOARD_LL这个参数再2000,xp中都可以用把!!
    2000用装sp3么?
    拥着个参数是否有什么要求!?
    请高手指点!