2013-07-17 50 views
1

我想實現一個API掛鉤機制。Delphi API掛鉤行爲奇怪

我有什麼,到目前爲止,是通過SetWindowsHookEx呼叫注入到其他進程DLL,以及一些代碼來實現鉤自己。

例如,我可以成功跨越鉤多個不同應用MessageBoxA電話(那不是最終目標)。

我需要做的是掛鉤一些圖形功能,特別的TextOut功能,因爲我需要能夠屏幕抓取。

現在 - 我知道其中的TextOut函數,我需要(TextOutA/WExtTextOutA/W對我試圖訪問的應用程序),我知道我需要掛鉤Begin/EndPaintGet/ReleaseDCDC的匹配窗口處理並確定文本輸出是否在我感興趣的窗口上。

我的問題是,雖然我可以掛鉤textout函數,messageboxes等沒有任何問題,因此,GetDC導致硬碰撞作爲是否BeginPaint

的代碼是很長,所以我會後我有什麼用的問題,但我可以發佈更多,如果有幫助。

粗框架工作如下;

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

    Result := BeginPaint(hWnd, lpPaint); 

    InstallHook(); 
end; 

即使這個相當簡單的功能不斷地失敗,返回零。

我在一個完全無法解釋怎麼回事,因爲hWnd總是1309192儘管嘗試這種在多臺機器。

+0

你說你會得到一個「硬碰撞」調用GetDC和BeginPaint的時候,那你說你的報價功能,調用BeginPaint的返回零 - 如果它崩潰了,怎麼能返回零?另外,你的意思是「硬崩潰」 - 應用程序崩潰,系統崩潰,BSOD?你在使用哪種操作系統?你的應用程序是32位還是64位?你是否掛鉤了32或64位進程?沒有更多的信息,這就像一個難以回答的問題。 –

+0

請編輯你的問題,並添加你的Delphi版本的標籤。你也瞄準Win64或Win32? –

+0

另外,如果'BeginPaint'返回零/ null,那是因爲你給它一個壞HWND。 HWND總是一樣的可疑 - 這應該不是真正的預期。調用CustomBeginPaint'在哪裏?如果它是直接掛鉤回調,你如何設置掛鉤?你能顯示你的遠期申報嗎? –

回答

0

所以關鍵問題是,正如Andreas Hausladen提到的線程安全 - 但不是由於VCL。