键盘钩子问题:我想在我的dll中加如键盘钩子,我希望任何进程调用它的时候,都能响应键盘事件,不需要进程序loadlabary请问如何做?在我写的其他程序中loadlibary,能够响应键盘,但是如果把loadlibary放在dll本身???能行吗?我在DLL中已经加如了KeyboardProc(.....)和installhook()关于如何安装这个钩子,我不知道怎么办,我尝试在DllMain中加入installhook();
编译是没问题,但是并未响应键盘事件!
另外用到hins=AfxGetInstanceHandle();这句的时候编译没问题,但运行就出错。
请问怎么办?

解决方案 »

  1.   

    把钩子处理放在DLL中就行了,
    然后在安装钩子时进程项填NULL就可以实现全局系统HOOK
    监视其它进程
    DLL中怎么可以loadlibary呢..
    loadlibary就是用来半截DLL的啊,,
      

  2.   

    谢谢你的回答,我的意思是将安装键盘钩子的过程放在DLL自身,同时我的键盘钩子处理都在此DLL中,这样不管是哪个进程序,只要调用这个DLL就能对键盘响应,而不需要在调用此dll的进程中loadlibary(...).  请帮我看看代码:
    #pragma data_seg(".sharedata")
    static HHOOK hkb=NULL;
    #pragma data_seg()
    HINSTANCE hins;LRESULT __declspec(dllexport)__stdcall  CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    if(wParam==VK_CONTROL)//显示主窗口
      {
    MessageBox(NULL,"hello","info",0);
      }
    return 0;
    }BOOL __declspec(dllexport)_stdcall installhook()
    {
    hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
    return true;
    }BOOL __declspec(dllexport)  UnHook()
    {
       BOOL unhooked = UnhookWindowsHookEx(hkb);
       return unhooked;
    }
    BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
    {
    /*我的hins还没初始化,用 hins=AfxGetInstanceHandle();运行时就会出错,而我在我自己写的程序中这句话就不会有问题*/
    installhook();//这句话对吗?
    }
      

  3.   

    loadlibary不可以放在DLL里的,
    键盘钩子只要写在DLL文件中就可以实现
    全局监视的
    hins初始化可以这样写
    BOOL CHodllApp::InitInstance ()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    hins=AfxGetInstanceHandle();
    }
      

  4.   

    我的dll原来并不是钩子dll.现在为了需要,要加入键盘钩子处理。
    但不知道怎么回事,没法响应键盘。
      

  5.   

    仅供参考,hins初始化在DLLMAIN中写,hins=hInst;//hInst为DllMain的参数
    安装钩子不要放在DllMain()中,你把installhook() 做成导出函数,
    在程序中loadLibray()后再调用,,
    因为你的installhook()中这样写了
    SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
    所以一样能起到HOOK全局的目的,,
    你把全局HOOK的意思理解错了,其实只要你的程序安装了全局HOOK
    就可以HOOK所有进程了,并非要每个进程都去安装,
    网上这方面的文章很多,你用google搜一下,,
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
      {
      //如果使用lpReserved参数则删除下面这行
      UNREFERENCED_PARAMETER(lpReserved);
      if (dwReason == DLL_PROCESS_ATTACH)//加载DLL
      {
       TRACE0("MOUSEHOOK.DLL Initializing!\n");
       //扩展DLL仅初始化一次
       if (!AfxInitExtensionModule(MousehookDLL, hInstance))
       return 0;
       glhInstance=hInstance;//在这里初始化
       //插入保存DLL实例句柄
      }
      else if (dwReason == DLL_PROCESS_DETACH)//释放DLL
      {
       TRACE0("MOUSEHOOK.DLL Terminating!\n");
       //终止这个链接库前调用它
       AfxTermExtensionModule(MousehookDLL);
      }
      return 1;
      }