请问为什么在服务程序里面安装日志钩子会失败??????????????????????? 
http://community.csdn.net/Expert/topic/3699/3699043.xml?temp=.791073
-------------------------------------------------------------------------
在dll中用EnableHook()启动钩子程序~h_Hook = SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)KeyHookProc,DllHinst,0);在一般exe里面都可以成功Enable可是在把exe程序做成服务以后,在enable就不行了~在服务里面调用dll,获得EnableHook函数入口也是正确的,只是EnableHook函数老是返回钩子安装失败的信息请问为什么?是日子钩子的缘故还是其他缘故??写写了~

解决方案 »

  1.   

    There are two issues that could be causing you trouble that come to mind.1. The service may need "Interact with Desktop" privileges.
    2. The service may be running under a limited-rights account which does not have permissions to install a system hook.There may be other issues here, but I don't know of any. However, I'm not an expert on the intracies of Windows services.
      

  2.   

    这个问题一言难尽,简而言之吧。
    有几个前提:
    1、钩子必须安装在特定的桌面(Desktop)上
    2、桌面位于窗口站(WindowStation)内
    3、线程可以与一个桌面关联,进程可以与一个窗口站关联
    4、只有 WinSta0 窗口站是可见的
    3、服务程序如果没有配置为可交互式的服务,则其关联的窗口站是不可见的(也即并非 WinSta0)
    系统默认创建了 3 个桌面于 WinSta0 窗口站上,分别为 WinLogon 用于用户登录的桌面(也就是显示登录对话框的那个桌面);Default 用于登录用户交互的桌面和 ScreenSaver 用于运行屏保程序的桌面。
    你的工作要想成功,有两种选择:
    1、将服务注册为可交互的服务
    2、自己设置服务程序的窗口站以及桌面
    但又都有其他的一些小问题需要注意。如果采用 1,好处是比较简单,但好像微软已经不太提倡可交互的服务程序;如果采用 2,好处是灵活,但需要自己考虑用户登录后切换线程的桌面,而且成功需要大量的调试工作,因为有无数的文档中语焉不详的陷阱。
    两种办法共有的问题是:在 XP 及以后的系统里,对于使用了了快速用户切换的机器,你仍然无法完全达到你的目的,这是操作系统的限制,不可逾越。
    祝你好运。
      

  3.   

    我来说两句,我也遇到过类的问题,日志钩子不运行。用GetLastError()函数查看有错误发生,于是我就用了SetLastError(0),返回后再重新安装日志钩子,这次成功了,具体是怎么回事,我到现在还不明白,有那位大虾能指点一下。
      

  4.   

    jiangsheng(蒋晟.MSMVP2004Jan) 说得对,
    请楼主检查是当前运行的桌面是否可以安装WH_JOURNALRECORD类型的勾子。
      

  5.   

    请楼主检查是当前运行的桌面是否可以安装WH_JOURNALRECORD类型的勾子。
      

  6.   

    to 楼上二位,如何检查?
    我在exe里面都正常的~