2012-04-24 166 views

回答

24

OPTION 1

IWin32Window只需要一個Handle的性質,因爲你已經有了的IntPtr這是不是太難以實施。 Create a wrapper類,它實現IWin32Window:

public class WindowWrapper : System.Windows.Forms.IWin32Window 
{ 
    public WindowWrapper(IntPtr handle) 
    { 
     _hwnd = handle; 
    } 

    public WindowWrapper(Window window) 
    { 
     _hwnd = new WindowInteropHelper(window).Handle; 
    } 

    public IntPtr Handle 
    { 
     get { return _hwnd; } 
    } 

    private IntPtr _hwnd; 
} 

你會再得到你IWin32Window這樣的:

IWin32Window win32Window = new WindowWrapper(new WindowInteropHelper(this).Handle); 

或(響應KeithS」建議):

IWin32Window win32Window = new WindowWrapper(this); 

OPTION 2 (thx to Scott Chamberlain的評論)

使用現有的實現IWin32Window的NativeWindow類:

IWin32Window win32Window = new NativeWindow(); 
((NativeWindow)win32Window).AssignHandle(new WindowInteropHelper(this).Handle); 
+0

很好的回答;該類可能會接受一個Window並處理第一層WindowInteropHelper包裝,所以您只需要「新的WindowWrapper(this)」,並且您有一些東西可以作爲IWin32Window傳入。 – KeithS 2015-04-11 01:56:51

+3

而不是製作自己的類.NET在其[NativeWindow'](https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow%28v=vs)中已經提供了類似的類。 110%29.aspx)課程。只需調用['AssignHandle(IntPtr)'](https://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.assignhandle(v = vs.110).aspx)由OP提供的功能。 – 2015-04-16 04:28:46

+0

我無法獲得選項2編譯。我的代碼... 'System.Windows.Forms.IWin32Window win32Window = new System.Windows.Forms.NativeWindow(); win32Window.AssignHandle(new WindowInteropHelper(this).Handle);' ...導致編譯錯誤「IWin32Window不包含AssignHandle的定義」。我嘗試使用IWin32Window的System.Windows.Interop版本,但沒有NativeWindow()方法。 – 2017-12-28 15:27:04