.net - 将 .NET 表单设置为 HWND 的父级

标签 .net winforms user-interface winapi c++-cli

我正在开发一个在某个应用程序内部运行的插件(C++/CLI DLL),我只知道该应用程序的 HWND。我的插件显示了我希望充当主应用程序子级的各种 .NET 表单(例如,以主窗口为中心等)。这是我尝试过的:

// MyDialog.h
public ref class MyDialog : public System::Windows::Forms::Form {
    public:
        MyDialog(const int parentHWND);

    private:
        IntPtr parent_;
};

// MyDialog.cpp
// Attempt1: Use SetParent and CenterParent
MyDialog::MyDialog(const int parentHWND) : parent_(parentHWND) {
    SetParent(reinterpret_cast<HWND>(this->Handle.ToPointer()), reinterpret_cast<HWND>(parent_.ToPointer()));

    this->StartPosition = FormStartPosition::CenterParent;
}

这似乎使 MyDialog 充当子级(即,您无法将其移出主应用程序等),但对 CenterParent 的调用没有达到预期的结果。

我在网上发现了一些想法(包括 SO ),建议从 HWND 创建 NativeWindow 并将其传递给 Show():

// in MyDialog.h
void Show() new;

// MyDialog.cpp
// ...
void MyDialog::Show() {
    NativeWindow^ nw = gcnew NativeWindow();
    nw->AssignHandle(parent_);
    this->Show(nw);
}

但是,在我可以测试的所有情况下,这似乎都会导致主应用程序崩溃(有趣的是,在显示我的对话框之后)。如果我能获得崩溃信息,我将更新该帖子。

我正在寻找有关如何始终如一地实现所需行为的建议。我所需要的只是能够将无模式对话框置于主窗口的中心,并让它充当子窗口。

如有任何帮助,我们将不胜感激。

最佳答案

我遇到了类似的问题...如果您覆盖 Form.OnLoad 并且不调用 MyBase.OnLoad 则 StartPosition.CenterParent 无效

关于.net - 将 .NET 表单设置为 HWND 的父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892512/

相关文章:

android - Flutter 可以允许访问本地代码中的小部件吗?

javascript - 动画自定义电池填充图标

mysql - 如何将 JWT 链接到我的用户信息数据库

c# - FormView.DataItem 在回发时为 null

c# - 表单在 backgroundworker 中不显示为对话框?

c# - ClickOnce 无法在 Windows Vista SP2 上安装 LocalDB 2012

c# - 从另一个窗体调用方法c#

c# - 使用通用接口(interface)配置通用工作流程

.net - 无法加载共享库 'libldap-2.4.so.2' 或其依赖项之一

c# - 如何将空组添加到 Linq 查询结果集中?