Windows Form 和 Unmanaged 應用程式概觀
Windows Form 應用程式和控制項在某些狀況下可以與 Unmanaged 應用程式互通。 下面幾節描述 Windows Form 應用程式和控制項所支援的案例及組態,以及它們不支援的案例及組態。
Windows Form 控制項和 ActiveX 應用程式
由於 Microsoft Internet Explorer 和 Microsoft Foundation Class (MFC) 的例外狀況,Windows Form 控制項在設計要裝載 ActiveX 控制項的應用程式中不受支援。 其他可以裝載 ActiveX 控制項的應用程式和開發工具 (包括在 Visual Studio .NET 2003 之前的 Visual Studio 版本中的 ActiveX 測試容器) 都是 Windows Form 控制項不支援的主應用程式。
這些條件約束也會套用到透過元件物件模型 COM Interop 使用的 Windows Form 控制項。 透過 COM 可呼叫包裝函式 (CCW) 使用 Windows Form 控制項,只有在 Internet Explorer 中受到支援。 如需 COM Interop 的詳細資訊,請參閱
COM Interop (Visual Basic) 和 進階 COM 互通性
下表顯示 Windows Form 控制項的可用 ActiveX 裝載支援。
Windows Form 版本 |
支援 |
---|---|
.NET Framework 1.0 版 |
Internet Explorer 5.01 (含) 以後版本 |
.NET Framework 1.1 (含) 以後版本 |
Internet Explorer 5.01 (含) 以後版本 Microsoft Foundation Class (MFC) 7.0 (含) 以後版本 |
裝載 Windows Form 元件當做 ActiveX 控制項
在 .NET Framework 1.1 中,支援已延伸到包含 MFC 7.0 (含) 以後版本。 這項支援包括與 MFC 7.0 (含) 和以後版本的 ActiveX 控制項容器完全相容的任何容器。
但是,並不支援將 Windows Form 控制項當做 ActiveX 控制項的註冊。 同時,也不支援呼叫 Windows Form 控制項的 com.ms.win32.Ole32.CoCreateInstance 方法。 只支援 Windows Form 控制項的 Managed 啟動過程 (Activation)。 在您建立 Windows Form 控制項後,可以將它裝載在 MFC 應用程式中,如同裝載 ActiveX 控制項一般。
若要在 Unmanaged 應用程式中使用 Windows Form 控制項,您必須使用 Unmanaged CLR 裝載 API 來裝載 CLR,或使用 C++ Interop 功能。 使用 C++ Interop 功能是建議的方案。
COM 用戶端應用程式中的 Windows Form
當您從 COM 用戶端應用程式 (例如 Visual Basic 6.0 應用程式或 MFC 應用程式) 中開啟 Windows Form 時,表單可能無法按照預期的方式運作。 例如,當您按 TAB 鍵時,焦點 (Focus) 並不會從某個控制項變更到另一個控制項。 當命令按鈕有焦點時按 ENTER 鍵,也不會引發按鈕的 Click 事件。 您可能還會遇到按鍵或滑鼠活動的無法預期行為。
這種行為的發生,是因為 Unmanaged 應用程式未實作讓 Windows Form 正常運作所需的訊息迴圈支援。 COM 用戶端應用程式所提供的訊息迴圈與 Windows Form 的訊息迴圈在根本上並不相同。
應用程式的訊息迴圈是一個內部程式,它會從執行緒的訊息佇列中擷取訊息,再轉譯訊息,然後將訊息傳送到應用程式以進行處理。 Windows Form 的訊息迴圈並沒有與舊版應用程式 (例如 Visual Basic 6.0 應用程式和 MFC 應用程式) 所提供的訊息迴圈相同的架構。 張貼到訊息迴圈的視窗訊息之處理方式可能會與 Windows Form 所預期的不同。 因此,可能會發生無法預期的行為。 有些組合鍵可能無法運作、有些滑鼠活動可能無法運作,或者可能會引發一些預期的事件。
解決互通性問題
您可以在 .NET Framework 訊息迴圈上顯示表單以解決這些問題,這個訊息迴圈是使用 Application.Run 方法所建立。
若要使 Windows Form 能從 COM 用戶端應用程式正確運作,您就必須在 Windows Form 訊息迴圈中執行 Windows Form。 若要這麼做,請使用下列其中一種方法:
您可以使用 Form.ShowDialog 方法來顯示 Windows Form。 如需詳細資訊,請參閱 HOW TO:顯示 Windows Form 和 ShowDialog 方法以支援 COM Interop。
在新的執行緒上顯示每一個 Windows Form。 如需詳細資訊,請參閱 HOW TO:在自己的執行緒上顯示每個 Windows Form 以支援 COM Interop。
請參閱
工作
HOW TO:顯示 Windows Form 和 ShowDialog 方法以支援 COM Interop
HOW TO:在自己的執行緒上顯示每個 Windows Form 以支援 COM Interop
參考
Aximp.exe (Windows Form ActiveX 控制項匯入工具)