我正在爲傳統Win32應用程序創建託管WPF UI前端。 WPF前端是可執行文件;作爲其啓動例程的一部分,我在第二個線程中將遺留應用程序作爲DLL啓動。在主UI線程上調用傳統應用程序的任何UI操作(包括CreateWindowsEx
等)。託管的主UI線程是否停留在同一個(非託管的)操作系統線程上?
作爲應用程序關機過程的一部分,我想正確清理。除其他外,我想在所有非託管窗口上撥打DestroyWindow
,以便他們能夠正確清理自己。因此,在關機期間,我使用EnumWindows
嘗試查找所有非託管窗口。然後我調用DestroyWindow作爲我生成的列表。這些在主UI線程上運行。
在此背景知識後,我的實際問題:
在EnumWindows的枚舉過程中,我必須檢查返回的頂層窗口之一是否是我的非託管窗口之一。我通過調用GetWindowThreadProcessId
來獲取窗口創建者的進程ID和線程ID。我可以將進程ID與Process.GetCurrentProcess().Id
進行比較,以檢查我的應用是否創建了它。
爲了額外的安全性,我也想看看我的主UI線程是否創建了窗口。但是,返回的線程ID是操作系統的ThreadId(它與託管線程ID不同)。如this question中所述,CLR保留將託管線程重新安排到不同OS線程的權利。我可以依靠CLR來「足夠聰明」,永遠不會爲主UI線程執行此操作(由於UI的線程相關性)?然後我可以調用GetCurrentThreadId
來獲取主UI線程的非託管線程ID以進行比較。
這聽起來像我的預期。我認爲在這個地方沒有官方/半官方聲明? – 2010-05-07 14:20:53