我正在尝试实现API挂钩机制。
到目前为止,我是通过SetWindowsHookEx
调用注入其他进程的DLL,以及一些用于实现钩子的代码。
例如,我可以成功地在多个不同的应用程序中挂起MessageBoxA
个调用(这不是最终目标)。
我需要做的是挂钩一些图形功能,特别是textout功能,因为我需要能够屏幕刮擦。
现在 - 我知道我需要哪些textout函数(TextOutA/W
,ExtTextOutA/W
用于我正在尝试访问的应用程序),而且我知道我需要挂钩{{1} }或Begin/EndPaint
将Get/ReleaseDC
与窗口句柄匹配,并确定文本输出是否在我感兴趣的窗口上。
我的问题是,虽然我可以挂钩textout函数,消息框等,但没有任何问题,DC
会像GetDC
一样导致严重崩溃。
代码很长,所以我会发布我遇到的问题,但是如果它有帮助我可以发布更多。
粗略的框架工作如下;
BeginPaint
即使这个非常简单的功能也会不断失败,返回零。
我完全无法解释最新情况,因为function CustomBeginPaint(hWnd: HWND; var lpPaint: TPaintStruct): HDC;
begin
UninstallHook();
Result := BeginPaint(hWnd, lpPaint );
InstallHook();
end;
始终是1309192,尽管在多台机器上尝试了这一点。
答案 0 :(得分:0)
所以关键问题是,正如Andreas Hausladen所提到的线程安全性 - 但不是由于VCL。