2010-03-20 8 views

risposta

23

Control.FromHandle

(Che si ottiene l'oggetto di controllo, che implementa l'interfaccia IWin32Window.)

Eg.

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

Nota che questo si basa sull'handle "acquisito da una proprietà Handle di un modulo/controllo". Non è possibile utilizzare questa tecnica con un handle di finestra Win32 arbitrario.

+0

James, ho modificato una qualifica nella tua risposta perché le persone che arrivano da una ricerca più generale su 'IntPtr' e' IWin32Window' possono solo leggere il titolo della domanda e non apprezzare il vincolo nei dettagli della domanda. Spero che questo sia ok. – itowlson

+0

No, è una buona modifica. Probabilmente hai salvato qualche sfortunato programmatore futuro da ore di grattacapo chiedendoti perché non possa magicamente creare un oggetto Control/IWin32Window da un HWND non elaborato. :) –

20

C'è un metodo più semplice che è supportato direttamente dal framework .NET senza dover creare una propria classe personalizzata. È possibile utilizzare questo con qualsiasi handle di finestra arbitrario.

Dato ptrWindowHandle di tipo IntPtr:

using System.Windows.Forms; 

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

System.Windows.Forms.NativeWindow implementa l'interfaccia IWin32Window.

+14

Puoi anche usare il comando statico 'NativeWindow.FromHandle (ptrWindowHandle);' –

+0

@MattSmith Ho scoperto che deve essere assegnato. FromHandle non funziona per me a meno che AssignHandle non sia stato utilizzato in precedenza. Ad esempio questo funziona: 'NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle (GetConsoleWindow()); box.ShowDialog (NativeWindow.FromHandle (GetConsoleWindow())); '(o anche' box.ShowDialog (nativeWindow); ') ... ma questo one-liner senza l'assegnazione non:' box.ShowDialog (NativeWindow. FromHandle (GetConsoleWindow())); ' – Jay

Problemi correlati