SetWindowsHookEx 拒绝访问的诡异问题(全局成功,局部失败)

hzy694358 2012-11-12 08:58:39
SetHookEx函数在一个独立的dll中,作为dll的导出函数。
HHOOK SetHookEx(DWORD ThreadId)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

HHOOK hHook = ::SetWindowsHookEx(WH_GETMESSAGE,HookProc,hInst,ThreadId);
if (hHook == NULL)
{
DWORD dwError = GetLastError();
CString str;
str.Format(_T("dwError:%d\r\n"),dwError);
LOG_ERROR(str);
}

return hHook;
}
ThreadId 如果传入0(全局钩子) 则返回正常
如果是某个线程ID,返回空, 错误码:dwError:5 拒绝访问
这是什么情况,为什么线程钩子会失败呢
...全文
367 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻X 2012-11-14
  • 打赏
  • 举报
回复
从下面2个方面考虑 1.如果是WIN7之后的操作系统对权限的管理非常严格,看看是否有System和Administrator权限问题 2.目前许多桌面防护软件(类似360)可能会作相对应保护,关闭看看
chayedanwc 2012-11-14
  • 打赏
  • 举报
回复
调用Hook的Server服务程序与你要注入的线程是否运行在同一个Section下面? Server服务运行的用户有一部分是在SYSTEM用户下面,是访问不了Desktop进程(线程)的。 同时,如果你的Server与待注入的进程(线程)没有运行在同一个Section下面,同样会注入失败。 全局钩子不指定注入对象,故不受影响。
hzy694358 2012-11-13
  • 打赏
  • 举报
回复
引用 4 楼 yyyyy_3 的回复:
hInst是否也需要传入呢? 如果不行, 就用全局钩子吧.
全局钩子得过滤不需要的进程, 这个要在哪个地方过滤呢
hzy694358 2012-11-13
  • 打赏
  • 举报
回复
msdn: hMod [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process. dwThreadId [in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. 还是看不明白
yyyyy_3 2012-11-13
  • 打赏
  • 举报
回复
hInst是否也需要传入呢? 如果不行, 就用全局钩子吧.
hzy694358 2012-11-13
  • 打赏
  • 举报
回复
看这个帖子还是没看明白能否挂钩其他进程的 http://bbs.csdn.net/topics/230056375 msdn: An error may occur if the hMod parameter is NULL and the dwThreadId parameter is zero or specifies the identifier of a thread created by another process. 如果hMod为空,dwThreadId 为0 或者由其他进程创建的线程会产生错误 那如果hMod 不为空呢??? 到底能不能挂钩其他指定进程呢???
hzy694358 2012-11-13
  • 打赏
  • 举报
回复
引用 1 楼 coyer 的回复:
你确认你传入的线程id是正确的,并且是一个有消息循环的线程? 另外,按我得理解,传入的线程id必须是本进程的吧,其他进程的线程id是可以的吗?
线程id是第三方桌面程序当然有消息循环 哪边有说不能挂钩其他进程的线程吗???
hzy694358 2012-11-13
  • 打赏
  • 举报
回复
为什么会拒绝访问呢 为什么会拒绝访问呢 为什么会拒绝访问呢
coyer 2012-11-12
  • 打赏
  • 举报
回复
你确认你传入的线程id是正确的,并且是一个有消息循环的线程? 另外,按我得理解,传入的线程id必须是本进程的吧,其他进程的线程id是可以的吗?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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