API フック メカニズムを実装しようとしています。
私がこれまでに持っているのは、SetWindowsHookEx
呼び出しを介して他のプロセスに挿入された DLL と、フック自体を実装するためのコードです。
たとえば、MessageBoxA
複数の異なるアプリケーション間で呼び出しを正常にフックできます (これは最終目標ではありません)。
私がする必要があるのは、いくつかのグラフィック関数、特にスクレイプをスクリーンできるようにする必要があるテキストアウト関数をフックすることです。
今-私は必要なテキストアウト関数(TextOutA/W
、ExtTextOutA/W
アクセスしようとしているアプリケーション用)を認識しており、をウィンドウハンドルにフックBegin/EndPaint
またはGet/ReleaseDC
一致させ、テキストアウトがDC
気になる窓。
私の問題は、テキストアウト関数、メッセージボックスなどを問題なくフックできる一方GetDC
で、ハードクラッシュが発生することBeginPaint
です.
コードはかなり長いので、私が問題を抱えているものを投稿しますが、役に立ったらもっと投稿できます。
大まかなフレームワークは次のとおりです。
function CustomBeginPaint(hWnd: HWND; var lpPaint: TPaintStruct): HDC;
begin
UninstallHook();
Result := BeginPaint(hWnd, lpPaint );
InstallHook();
end;
この非常に単純な関数でさえ、常に失敗し、ゼロを返します。
hWnd
複数のマシンでこれを試しても常に 1309192であるため、何が起こっているのかを説明するのは完全に途方に暮れています。