服务程序中为何全局鼠标钩子失效?(参见代码,分不够再加)

zmrzzg 2005-07-12 09:43:40
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam);

void _ServiceMain( void* )
{
SelectDesktop("default");//切换到default桌面
MouseglhHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,
AfxGetInstanceHandle(),GetCurrentThreadId());
if(MouseglhHook)
MessageBeep(1);/// 为了调试服务程序
// Waiting for stop the service
while( WaitForSingleObject( hStopServiceEvent, 10 ) != WAIT_OBJECT_0 )
{
}
UnhookWindowsHookEx(MouseglhHook);

// Let's delete itself, after the service stopped
DeleteSvc();

CloseHandle( hStopServiceEvent );
}

LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
MessageBeep(1);/// 为了调试服务程序
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;
if (wparam==513)
{
///Do something
}
return CallNextHookEx(MouseglhHook,nCode,wparam,lparam);
//继续传递消息
}

问题:调用SetWindowsHookEx时成功,但钩不到鼠标信息,也就是MouseProc(int nCode,WPARAM wparam,LPARAM lparam)没有跟踪到消息,请问是为什么?
...全文
223 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmrzzg 2005-07-12
  • 打赏
  • 举报
回复
我试过了,服务启动时我将它设置成default桌面,然后再调用SetWindowsHookEx启动钩子,此时都是成功的,但钩子的回调函数MouseProc(int nCode,WPARAM wparam,LPARAM lparam)钩不到信息,为什么呢?
kuangjingbo 2005-07-12
  • 打赏
  • 举报
回复
因为服务使用的是localsystem账户,她会产生自己的windows station和 desktop.
而当以用户身份登录时,使用的是winsta0(windows station)和defaul桌面。
不同的windows station / desktop下的 应用程序不能是用鼠标键盘挂钩

楼上的方法可以试一下
zmrzzg 2005-07-12
  • 打赏
  • 举报
回复
re pitchstar:
我的服务程序是允许与界面交互的.
pitchstar 2005-07-12
  • 打赏
  • 举报
回复
在服务的属性中选中:"和界面交互" 试一下

原理可以参考 <windows2000 内部揭秘> 机械工业出版社,英文名 inside microsoft windows2000
lianglp 2005-07-12
  • 打赏
  • 举报
回复
注意:
1.
勾子句柄是一个用户句柄,它属创建的线程所拥有,如果当创建的线程退出,则勾子将变为无效。

2.
目标勾子线程需要消息循环为基础。

3.
夸桌面勾子没有意义。
lianglp 2005-07-12
  • 打赏
  • 举报
回复
勾子是以消息循环为基础的。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧