7

WinForm ダイアログの所有者の HWND を取得できる必要があります。アンマネージでは、前面のウィンドウの HWND を取得するバックグラウンド スレッドがあります。次に、コードは ::GetParent(frontHWND) を呼び出して、別の非モーダル MFC ダイアログを非表示にする必要があるかどうかを確認します。WinForm ダイアログが frontHWND の場合、GetParent 呼び出しに対して常に NULL が返されます。また、.Net が親と所有者の違いをクリーンアップしようとしたことを認識して、GetOwner を試しました。Spy++ を使用して WinForm ダイアログを見ると、WinForm には親または所有者がいないとも表示されます。通ってきました

NativeWindow ^natWin = gcnew NativeWindow();
natWin->AssignHandle(IntPtr(hwndParent));
managedDlg->ShowDialog(natWin);

上記のコードは、WinForm の所有者を設定しませんでした。OnFormShown() で WinForm コードから Win32 SetParent を呼び出してみましたが、MFC アプリケーションと WinForm がロックされました。

管理されていないダイアログ/アプリを管理されたwinformの所有者/親にする方法を誰かが説明できますか?

4

1 に答える 1

5

C++ の親を持つ C# フォームを表示するには、次のようにします。

void GUIWrapper(HWND parent)
{
    System::IntPtr myWindowHandle = System::IntPtr(parent);
    System::Windows::Forms::IWin32Window ^w = System::Windows::Forms::Control::FromHandle(myWindowHandle);
    ManagedDialog::ManagedDialogGUI ^d = gcnew ManagedDialog::ManagedDialogGUI();
    d->Show(w);
}

このコードは、C++/CLI ラッパー DLL に入れられます。お役に立てれば。

編集: Control::FromHandleが失敗する可能性があるため、 「w」はnullptrに対してテストする必要があります。ここを参照してください: なぜ Control.FromHandle(IntPtr) はフックされたプロセスで null を返し、「フォーム」の有効なオブジェクトを返しますか? 別のフックされたプロセスで?

したがって、フェイルセーフ コードは次のようになります。

    if (w == nullptr)
        d->Show();
    else
        d->Show(w);
于 2011-07-12T14:44:17.947 に答える