2010-03-20 265 views

回答

23

Control.FromHandle

(這可以讓你控制的對象,它實現了IWin32Window接口。)

EG。

IntPtr myWindowHandle = IntPtr(someVal); 
IWin32Window^ w = Control::FromHandle(myWindowHandle); 

請注意,這依賴於「從窗體/控件的Handle屬性獲取的」句柄。你不能在任意的Win32窗口句柄中使用這種技術。

+0

James,我在你的答案中編輯了一個資格證書,因爲來自對IntPtr和IWin32Window進行更全面搜索的人可能只會閱讀問題標題而不理解問題細節中的約束條件。希望這沒關係。 – itowlson 2010-03-20 04:21:21

+0

不,這是一個很好的編輯。你可能從幾個小時的頭腦中想起了爲什麼他不能奇蹟般地從原始HWND創建一個Control/IWin32Window對象,從而挽救了一個倒黴的未來程序員。 :) – 2010-03-20 07:54:28

20

有一個更簡單的方法,直接由.NET框架支持,而無需創建自己的自定義類。您可以使用任意任意窗口句柄。

鑑於ptrWindowHandle類型的IntPtr的:

using System.Windows.Forms; 

NativeWindow nativeWindow = new NativeWindow(); 
nativeWindow.AssignHandle(ptrWindowHandle); 

System.Windows.Forms.NativeWindow實現IWin32Window接口。

+14

你也可以使用靜態'NativeWindow.FromHandle(ptrWindowHandle);' – 2013-01-24 16:23:22

+0

@MattSmith我發現它必須被分配。除非事先使用AssignHandle,否則FromHandle不適用於我。例如,這可以工作:'NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle(GetConsoleWindow()); box.ShowDialog(NativeWindow.FromHandle(GetConsoleWindow()));(甚至是'box.ShowDialog(nativeWindow);')...但是這個沒有賦值的單行不包含:'box.ShowDialog(NativeWindow。 FromHandle(GetConsoleWindow()));' – Jay 2017-12-14 07:31:16