2013-04-23 57 views
3

我需要一些關於win32 API的幫助,尤其是WindowsFromDc。WindowsFromDc返回null

我有一個應用程序掛鉤另一個應用程序。這兩個應用程序通過NamedPipe進行通信。在第二個應用程序中,我掛鉤了DrawTextExW函數,並從此函數中獲取HDC。

但是,當我用DrawTextEx函數返回的DC執行WindowsFromDC時,我得到了空返回值。

所以,我有一些問題: - 它可能是一個HDC沒有HDWN? - 如何獲取調用DrawTextEx的窗口的HWND?還有其他方法可以做到嗎?

謝謝。

PS:當通過跨進程對不起我的英文不好...

+1

你怎麼鉤?也許DC在第二個過程中無效?另請注意,CreateDC和CreateCompatibleDC創建可能與打印機相關的DC或可能是內存DC。這些沒有與他們關聯的窗口。你確定這個掛鉤的應用程序正在繪製一個Windows的DC嗎? – 2013-04-23 11:50:32

+0

我與Microsoft Detour庫掛鉤,並在第二個應用程序中注入DLL。我認爲DC是正確的,但即使我在注入的DLL中執行了WindowFromDC,我也得到了一個N​​ULL返回值。我如何確定應用程序是否在窗口的DC中繪圖? – 2013-04-23 17:30:50

回答

4

設備上下文句柄無效。所以你試圖做的事情是不可能的。

至於你的其他問題:

是否有可能有一個不與HWND相關的HDC

是的,這是完全可能的。大量的設備上下文與窗口無關。

我怎樣才能得到調用DrawTextEx的窗口的HWND

Windows不調用函數,代碼調用函數。所以,這個問題並不意味着什麼。

+0

是的,但是在Detour Library中,我使用在第二個應用程序中注入的DLL來掛鉤DrawTextEx函數。但有些時候,第二個應用程序打開另一個窗口,可能是2.因此,我也得到了第二個窗口的DrawTextEx的結果。我該怎麼做才能知道DrawTextEx在哪個窗口繪製? – 2013-04-23 17:36:33

+0

這不是它在問題中遇到的。在這個問題中,你談到了使用IPC進行通信的兩個進程。很難從DC推斷繪圖將要結束的地方。我懷疑你對這個問題的解決方案是行不通的。但不幸的是,你問了一個關於你的解決方案的問題,而不是問這個問題。這就是所謂的XY問題。 – 2013-04-23 17:48:54

+3

好吧,我明白了。所以我找到了一個我認爲很好的解決方案。我鉤開始繪畫和結束繪畫了。我知道調用應用程序代碼的過程是:BeginPaint - > DrawTextEx - > EndPaint。所以我保存了BeginPaint給出的HWND,並將它與DrawTextEx下一次調用相關聯。當調用EndPaint時,我清除保存的HWND。我認爲是很好的解決方案。非常感謝您對我的思考過程的幫助和幫助。下次我會盡力做得更好。 – 2013-04-23 20:08:22