我写了一个dll,并在这个dll里面:
hkMsg = SetWindowsHookEx(WH_CBT,(HOOKPROC)GetProcAddress(hHookDll,"MouseHookProc"), hInst,GetWindowThreadProcessId(FindWindow("Class", "目标窗口"),null));在windowsxp和2000里面都能正常将这个dll挂到目标窗口所在的进程上,但在windows98下却不行,在98下没反应,我用CProcess.exe查看,确实该dll没有成功注入到目标进程中。 奇怪的是,即使该dll没有成功注入到目标进程中,但SetWindowsHookEx返回不是0,也就是成功的,用GetLastError返回0也证实了这一点。另外,如果我故意把FindWindow("Class", "目标窗口")换为一个不存在的窗口,程序就会出错了,证明GetWindowThreadProcessId(FindWindow("Class", "目标窗口"),null));还是正确返回了目标进程主线程ID的了。 我也试过把WH_CBT换为别的也不行。
超纳闷,在网上查,得到的资料都是SetWindowsHookEx支持win98阿,那怎么我都不成功呢? 总结一下,函数执行是成功的,但dll没有注入目标进程。
hkMsg = SetWindowsHookEx(WH_CBT,(HOOKPROC)GetProcAddress(hHookDll,"MouseHookProc"), hInst,GetWindowThreadProcessId(FindWindow("Class", "目标窗口"),null));在windowsxp和2000里面都能正常将这个dll挂到目标窗口所在的进程上,但在windows98下却不行,在98下没反应,我用CProcess.exe查看,确实该dll没有成功注入到目标进程中。 奇怪的是,即使该dll没有成功注入到目标进程中,但SetWindowsHookEx返回不是0,也就是成功的,用GetLastError返回0也证实了这一点。另外,如果我故意把FindWindow("Class", "目标窗口")换为一个不存在的窗口,程序就会出错了,证明GetWindowThreadProcessId(FindWindow("Class", "目标窗口"),null));还是正确返回了目标进程主线程ID的了。 我也试过把WH_CBT换为别的也不行。
超纳闷,在网上查,得到的资料都是SetWindowsHookEx支持win98阿,那怎么我都不成功呢? 总结一下,函数执行是成功的,但dll没有注入目标进程。
=========
98根本就不支持这个API,当然不可能会成功了,但是98上用SetWindowsHookEx一定是没有问题,98下的用钩子的软件也很多,可能还是你的代码的事。
对不起,我拷贝错了,我是想说:“其实很简单,有没有在98里成功用过SetWindowsHookEx的呢?”
对不起,我拷贝错了,我是想说:“其实很简单,有没有在98里成功用过SetWindowsHookEx的呢?”
http://topic.csdn.net/t/20010727/13/211817.html他是win98下成功,2000下不行,哈哈,但我就2000下行98下不行
如果setwindowshookex的第3个参数hInst改为null时,目标进程会出错,提示“该程序执行了非法操作,即将关闭”详细情况大概是“某模块导致无效页操作,然后是一堆看不懂的代码”。不过这时用CProcess.exe(一个可查进程装载的dll的工具)来查,仍然是没有装载到我这个dll文件,会不会是windows98所谓dll只能装载一次?但至少这个情况说明,dll对目标进程的确产生了影响了(使其发生非法操作而关闭,哈哈)。想问下,第3个参数hInst起到什么作用呢?有和没有有什么区别?
hkMsg = SetWindowsHookEx(WH_CBT,(HOOKPROC)GetProcAddress(hHookDll,"MouseHookProc"), hInst,null);
已证实可以拦截到自己进程(即调用该dll的原本的程序,即我编写的程序)的消息并在MouseHookProc中处理。
照理说最后一个参数的null应该是拦截全局的WH_CBT消息的,可就是拦截不了其它程序的,这个和我在CProcess.exe中查到的结果是一致的(CProcess.exe中只有原始调用了该dll的程序加载了该dll)。