MFC (Native C++) 與 WinForm (Managed .NET) 屬於不同運行時,窗口句柄 (HWND) 雖可跨邊界傳遞,但 消息泵、焦點管理、Z-Order 由各自運行時獨立維護,直接 SetParent 會導致焦點丟失、模態阻塞、繪製異常。
| 方案 | 代碼片段 | 缺陷 |
|---|---|---|
| SetParent API | SetParent(form.Handle, mfcDlg.m_hWnd); | 焦點無法正確在雙邊切換,Alt+Tab 行為異常 |
| WPF HwndSource | HwndSourceParameters("WinForm"); params.ParentWindow = mfcDlg.m_hWnd; | 僅適用 WPF,WinForm 需額外封裝 |
| Windows Forms Interop | ElementHost 宿主 WPF 再宿主 WinForm | 層層嵌套,性能與維護成本高 |
CefSharp / WebView2 嵌入 Web UI,或直接遷移至 WinForm/WPF。Process.Start)。NamedPipe、WM_COPYDATA、TCP localhost 交換指令。TopMost=true、ShowInTaskbar=false 模擬子窗口行為。// C++/CLI 宿主 WPF UserControl
public ref class WpfHost : public System::Windows::Interop::HwndSource {
public:
WpfHost(HWND parent) {
HwndSourceParameters^ params = gcnew HwndSourceParameters("WpfContent");
params->ParentWindow = (IntPtr)parent;
params->WindowStyle = WS_CHILD | WS_VISIBLE;
this->RootVisual = gcnew MyWpfUserControl();
}
};
WPF 的 HwndSource 原生支持跨 HWND 宿主,焦點/輸入法/渲染均正常。
不建議強行將 MFC 對話框作為 WinForm 父窗口。優先考慮「業務邏輯 Native 化、UI 托管化」的分層架構,或採用進程隔離 + IPC 方案。