寻找WndProc地址

我怎样才能find一个WndProc( 另一个进程的窗口)的地址。 即使我注入一个DLL并尝试使用GetClassInfoEx()或GetWindowLong()或GetWindowLongPtr()来查找它,我总是会得到像0xffff08ed这样的值,这绝对不是一个可执行的地址。 这是根据MSDN:“…窗口过程的地址, 或代表窗口过程的地址句柄 ”。

不幸的是,这不够好,我需要的实际地址。 Spy ++大部分时间都能完成这项工作(但即使这样做有时也会失败)。 所以应该是可以的。 感谢名单。


[编辑:]克里斯贝克荣誉提供了一个超级快速,正确的解决scheme,我的小问题!

也许你正在被阻碍,因为你要求windowproc的错误版本。

Window Procs和应用程序一样,有两种版本:ansi和unicode。 Windows无法将一个原始指针返回到一个unicode应用程序的ansi窗口,反之亦然,因为它们会尝试用错误的字符串类型调用它。

所以,没有GetWindowLongPtr函数。 它的一个宏,解决了Windows API提供的两个“真实”函数:GetWindowLongPtrA和GetWindowLongPtrW。 如果窗口是一个unicode窗口,并且调用GetWindowLongPtrA,windows将返回一个句柄而不是原始指针,这样它就可以拦截调用(通过CallWindowProc制作)并将字符串从ansi编组为unicode。 相反的转换则是另一种方式。

即使你调用了正确的函数,你仍然可能会得到一个句柄 – 完全可能的是,ansi代码已经被子类化为unicode窗口。 所以windowproc已经完全被callWindowProc句柄之一所取代。

在这种情况下 – 我猜想运气不好。

为了扩大克里斯贝克的答案(这解决了我的问题,谢谢!):

所以,没有GetWindowLongPtr函数。 它的一个宏,解决了Windows API提供的两个“真实”函数:GetWindowLongPtrA和GetWindowLongPtrW。 如果窗口是一个unicode窗口,并且调用GetWindowLongPtrA,windows将返回一个句柄而不是原始指针,这样它就可以拦截调用(通过CallWindowProc制作)并将字符串从ansi编组为unicode。 相反的转换则是另一种方式。

您可以通过调用IsWindowUnicode函数来检查相关窗口是否为unicode或ANSI窗口。 使用这些信息,您可以确定哪个GetWindowLongPtr函数需要被调用(在运行时),