我正在尝试实现 API Hooking 机制。
到目前为止,我所拥有的是一个通过SetWindowsHookEx
调用注入其他进程的 DLL,以及一些用于实现挂钩本身的代码。
例如,我可以成功地挂钩MessageBoxA
跨多个不同应用程序的调用(这不是最终目标)。
我需要做的是挂钩一些图形功能,特别是文本输出功能,因为我需要能够进行屏幕抓取。
现在 - 我知道我需要哪些 textout 函数(TextOutA/W
对于ExtTextOutA/W
我试图访问的应用程序),并且我知道我需要挂钩Begin/EndPaint
或Get/ReleaseDC
匹配DC
's 到窗口句柄并确定 textout 是否在我感兴趣的窗口。
我的问题是,虽然我可以挂钩文本输出功能、消息框等而不会出现任何问题,但GetDC
会导致硬崩溃BeginPaint
。
代码很长,所以我会发布我遇到的问题,但如果有帮助,我可以发布更多。
大致框架如下;
function CustomBeginPaint(hWnd: HWND; var lpPaint: TPaintStruct): HDC;
begin
UninstallHook();
Result := BeginPaint(hWnd, lpPaint );
InstallHook();
end;
即使是这个非常简单的函数也会不断失败,返回零。
我完全无法解释发生了什么,因为hWnd
尽管在多台机器上尝试过,但它始终是 1309192。