2014-09-09 18 views
0

Я показываю диалог C# из моего класса C++. Я хочу установить окно, которое было создано в моем C++-коде, в качестве родителя моего диалога C#. Я передаю hwnd перед вызовом метода ShowDialog для C# диалога. Как использовать этот hwnd в моем методе C#; каков должен быть прототип и код метода C# в частности?Pass C++ Hwnd to C# dll

Благодаря

+0

- ваш проект C# для проекта Windows? или WPF? – Matt

+0

его проект C#, который имеет окно wpf, которое я хочу показать – WAQ

+0

Пожалуйста, прочитайте: WPF и Win32 Interoperation: http://msdn.microsoft.com/en-us/library/ms742522(v=vs.110).aspx – Matt

ответ

2

Вы можете просто выставить его в качестве IntPtr. Используйте NativeWindow.AssignHandle(), чтобы создать IWin32Window, который вам понадобится. ReleaseHandle(), когда вы закончите.

Это не помешает сделать его абсолютно безопасным, вы захотите узнать, когда родитель закрыт по какой-либо причине, и безопасность исключений является проблемой. Вдохновляя этот вспомогательный класс:

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

public class UnmanagedDialogParent : NativeWindow { 
    private Form dialog; 
    public DialogResult ShowDialog(IntPtr parent, Form dlg) { 
     if (!IsWindow(parent)) throw new ArgumentException("Parent is not a valid window"); 
     dialog = dlg; 
     this.AssignHandle(parent); 
     DialogResult retval = DialogResult.Cancel; 
     try { 
      retval = dlg.ShowDialog(this); 
     } 
     finally { 
      this.ReleaseHandle(); 
     } 
     return retval; 
    } 

    protected override void WndProc(ref Message m) { 
     if (m.Msg == WM_DESTROY) dialog.Close(); 
     base.WndProc(ref m); 
    } 

    // Pinvoke: 
    private const int WM_DESTROY = 2; 
    [DllImport("user32.dll")] 
    private static extern bool IsWindow(IntPtr hWnd); 
} 

Непрошеным, должно быть близко.

0

Это, как я сделал это

var helper = new WindowInteropHelper(myWpfWind); 
helper.Owner = hWnd; // hWnd is the IntPtr handle of my C++ window 
myWpfWind.ShowDialog(); 

Работает отлично !!!