c# - 将 C++ Hwnd 传递给 C# dll

标签 c# c++ mfc

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

谢谢

最佳答案

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

让它绝对安全不会有什么坏处,你会想知道父级何时因任何原因关闭并且异常安全是一个问题。启发这个助手类:

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

未经测试,应该接近。

关于c# - 将 C++ Hwnd 传递给 C# dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744155/

相关文章:

c# - Java/C# 消息传递的 REST 架构的性能

c++ - "universal-character-name encountered in source"警告的目的是什么?

c++ - MFC GUI 自定义控件 : how to draw cursor updates in response to mouse moves?

c++ - 无法将参数 1 从 'ATL::CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>' 转换为 'const char *'

c# - 使用.net框架开发cocoa应用程序

c# - 如何创建具有异步功能的类(类似于 SqlCommand 或 WebRequest)?

c++ - 如何简化这个 if 语句?

c++ - Dev C++ 中的链接器错误 : undefined reference to 'glfwInit'

c++ - CArchive 当前在文件中的位置

c# - VS2005/VS2008 数据集设计器,将一行插入到具有自动生成的 guid 列的表中