我想實現一個API掛鉤機制。Delphi API掛鉤行爲奇怪
我有什麼,到目前爲止,是通過SetWindowsHookEx
呼叫注入到其他進程DLL,以及一些代碼來實現鉤自己。
例如,我可以成功跨越鉤多個不同應用MessageBoxA
電話(那不是最終目標)。
我需要做的是掛鉤一些圖形功能,特別的TextOut功能,因爲我需要能夠屏幕抓取。
現在 - 我知道其中的TextOut函數,我需要(TextOutA/W
,ExtTextOutA/W
對我試圖訪問的應用程序),我知道我需要掛鉤Begin/EndPaint
或Get/ReleaseDC
到DC
的匹配窗口處理並確定文本輸出是否在我感興趣的窗口上。
我的問題是,雖然我可以掛鉤textout函數,messageboxes等沒有任何問題,因此,GetDC
導致硬碰撞作爲是否BeginPaint
。
的代碼是很長,所以我會後我有什麼用的問題,但我可以發佈更多,如果有幫助。
粗框架工作如下;
function CustomBeginPaint(hWnd: HWND; var lpPaint: TPaintStruct): HDC;
begin
UninstallHook();
Result := BeginPaint(hWnd, lpPaint);
InstallHook();
end;
即使這個相當簡單的功能不斷地失敗,返回零。
我在一個完全無法解釋怎麼回事,因爲hWnd
總是1309192儘管嘗試這種在多臺機器。
你說你會得到一個「硬碰撞」調用GetDC和BeginPaint的時候,那你說你的報價功能,調用BeginPaint的返回零 - 如果它崩潰了,怎麼能返回零?另外,你的意思是「硬崩潰」 - 應用程序崩潰,系統崩潰,BSOD?你在使用哪種操作系統?你的應用程序是32位還是64位?你是否掛鉤了32或64位進程?沒有更多的信息,這就像一個難以回答的問題。 –
請編輯你的問題,並添加你的Delphi版本的標籤。你也瞄準Win64或Win32? –
另外,如果'BeginPaint'返回零/ null,那是因爲你給它一個壞HWND。 HWND總是一樣的可疑 - 這應該不是真正的預期。調用CustomBeginPaint'在哪裏?如果它是直接掛鉤回調,你如何設置掛鉤?你能顯示你的遠期申報嗎? –