我写了一个服务程序,在服务的ServiceMain函数当中,我用LoadLibray载入Dll文件,用GetProgress函数获得DLL当中的函数地址,获得的函数实际执行的是安装键盘钩子函数的功能,代码段如下:
dllhinst=LoadLibrary(strDllPath);
if (dllhinst!=NULL)
{
lpfnDllFunc1=(LPFNDLLFUNC1)GetProcAddress(dllhinst, "SetKbHook"); //该函数执行的是安装键盘钩子
if (!lpfnDllFunc1)
{
FreeLibrary(dllhinst); 
error=TRUE;
}
else
   lpfnDllFunc1();  //该函数执行的是安装键盘钩子
        }

while (GetMessage(&msg,0,0,0))  
{
TranslateMessage(&msg);
DispatchMessage(&msg);
};在调试的时候,可以正确载入DLL,获得SetKbHook的地址,大概是0x1000100a,调试进入SetKbHook函数,能成功执行SetWindowsHookEx函数,但是之后,我敲击键盘,没有执行我挂钩的函数,即对键盘的消息没有响应。郁闷!!
  但是当我不编写程服务程序的话,仅仅从一个普通的应用程序中执行上面的代码,则可以正常响应我的键盘钩子函数,这是什么原因,请高手指点。  个人认为是服务程序的调用DLL的一些特性造成的,但不知从何找资料,帮帮忙吧!!!

解决方案 »

  1.   

    我菜,帮你想一下,是不是因为服务的EXE和桌面上的EXE不在同一层产生的问题,在运行services.msc  然后在你的那个服务右键属性--登录--允许服务和桌面交互  打钩用代码也可以,sogou一下,很多,
      

  2.   

    SetWindowsHookEx只能Hook同一桌面上的线程,服务程序与应用程序不是同一桌面。
      

  3.   

    不要试图用服务来设置钩子,对桌面进程是无效的,除非桌面进程被显式设置成了允许被其它帐户hook。