将C ++ Hwnd传递给C#dll

时间:2014-09-09 12:03:02

标签: c# c++ mfc

我正在从我的C ++类中显示一个c#对话框。我想将在我的C ++代码中创建的窗口设置为我的C#对话框的父窗口。我在调用C#对话框的ShowDialog方法之前传入了hwnd。我应该如何在我的C#方法中使用这个hwnd;什么应该是c#方法的原型和代码?

由于

2 个答案:

答案 0 :(得分:2)

您可以将其公开为IntPtr。使用NativeWindow.AssignHandle()创建您需要的IWin32Window。完成后释放手柄()。

让它绝对安全不会有害,你会想知道父母何时因任何原因被关闭而异常安全是一个问题。鼓励这个助手类:

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);
}

未经测试,应该接近。

答案 1 :(得分:0)

我就这样做了

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

工作得很好!!!