1

我正在尝试实现 API Hooking 机制。

到目前为止,我所拥有的是一个通过SetWindowsHookEx调用注入其他进程的 DLL,以及一些用于实现挂钩本身的代码。

例如,我可以成功地挂钩MessageBoxA跨多个不同应用程序的调用(这不是最终目标)。

我需要做的是挂钩一些图形功能,特别是文本输出功能,因为我需要能够进行屏幕抓取。

现在 - 我知道我需要哪些 textout 函数(TextOutA/W对于ExtTextOutA/W我试图访问的应用程序),并且我知道我需要挂钩Begin/EndPaintGet/ReleaseDC匹配DC's 到窗口句柄并确定 textout 是否在我感兴趣的窗口。

我的问题是,虽然我可以挂钩文本输出功能、消息框等而不会出现任何问题,但GetDC会导致硬崩溃BeginPaint

代码很长,所以我会发布我遇到的问题,但如果有帮助,我可以发布更多。

大致框架如下;

function CustomBeginPaint(hWnd: HWND; var lpPaint: TPaintStruct): HDC;
begin
  UninstallHook();

  Result := BeginPaint(hWnd, lpPaint );

  InstallHook();
end;

即使是这个非常简单的函数也会不断失败,返回零。

我完全无法解释发生了什么,因为hWnd尽管在多台机器上尝试过,但它始终是 1309192。

4

1 回答 1

0

所以关键问题是,正如 Andreas Hausladen 提到的线程安全 - 但不是由于 VCL。

于 2017-07-29T15:03:05.333 回答