设置钩子时失败,SetWindowsHookEx函数返回空值,不知哪里出了问题,恳请那位高手指导一下。 
LRESULT CALLBACK JournalRecordProc(int nCode,WPARAM wParam,LPARAM lParam) { 
   ......... return CallNextHookEx(hHook,nCode,wParam,lParam); 

void CHookDlg::OnButton1() 

// TODO:Add your control notification handler code here 
HINSTANCE   hinstance=AfxGetApp()->m_hInstance;
  hHook=::SetWindowsHookEx(WH_JOURNALRECORD,JournalRecordProc,hinstance,0); 
}

解决方案 »

  1.   

    WH_JOURNALPLAYBACK Global only 
    WH_JOURNALRECORD Global only 
    MSDN上都说它只能为全局钩子的了,所以必须做成DLL才可以。
      

  2.   

    MSDN上说这个全局钩子函数不同于其他全局钩子它不一定在DLL中使用
      

  3.   

    example:
    HHOOK g_hLogHook=NULL;     //钩子变量
    HWND g_hLastFocus=NULL;     
    //记录上一次得到焦点的窗口句柄
    const int KeyPressMask=0x80000000;  //键盘掩码常量
    char g_PrvChar;      //保存上一次按键值3.在Button1的OnClick事件中输入:void CHookDlg::Button1Click()
     {
      if  (g_hLogHook==NULL)
       g_hLogHook = SetWindowsHookEx
    (WH_JOURNALRECORD,
            (HOOKPROC)JournalLogProc,
    HInstance,0);  //安装日志钩子
     }4.在Button2的OnClick事件中输入:void  CHookDlg::Button2Click()
    {
     if (g_hLogHook!=NULL)
      {UnhookWindowsHookEx(g_hLogHook);
       g_hLogHook=NULL;
      }  //卸载日志钩子
    }5.输入钩子回调函数:
    HOOKPROC JournalLogProc(int iCode, 
    WPARAM wParam, LPARAM lParam)
    {
     if (iCode<0) return (HOOKPROC)CallNextHookEx (g_hLogHook,iCode,wParam,lParam); if (iCode="=HC_ACTION)" {EVENTMSG *pEvt="(EVENTMSG" *)lParam; int i; HWND hFocus; //保存当前活动窗口句柄 char szTitle[256]; //当前窗口名称 char szTime[128]; //保存当前的日期和时间 FILE *stream="fopen(“c:\\logfile.txt”,"a+t");" if (pEvt->message==WM_KEYDOWN)     
        {int vKey=LOBYTE(pEvt- >paramL);    // 取得虚拟键值
         char ch;
         char str[10];
         hFocus=GetActiveWindow();     
      //取得当前活动窗口句柄
         if(g_hLastFocus!=hFocus)     
      //当前活动窗口是否改变
          {GetWindowText(hFocus,szTitle,256);
           g_hLastFocus=hFocus;
           strcpy(szTime,DateTimeToStr(Now())
    .c_str());  //得到当前的日期时间
           fprintf(stream,"%c%s%c%c%s",
    10,szTime,32,32,szTitle);  //写入文件
           fprintf(stream,"%c%c",32,32);  
          }
     
       fclose(stream);
     return (HOOKPROC)CallNextHookEx
    (g_hLogHook,iCode,wParam,lParam);
    }
      

  4.   

    日志钩子不需要作dll
    http://baizhuang.d2g.com/software.asp有一个键盘录放机,用的就是日至钩子
      

  5.   

    OK我的问题解决了,谢谢kingzai和sxbyl(山野白菜) 。