首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC嵌入外部程序:將其他應用顯示在自有窗口內

     編輯:程式設計綜合問答

需求場景

在 MFC 應用中指定一個區域,用於顯示啟動的外部程序(如 Word、PDF 閱讀器)或文檔界面,而不是彈出獨立窗口。

核心方案

將 MFC 窗口設置為外部進程的父窗口。具體步驟:

  1. 使用 ShellExecuteEx 或 CreateProcess 啟動目標程序,獲取其主窗口句柄(HWND)。
  2. 調用 SetParent(hwndChild, hwndParent) 將外部窗口設置為 MFC 某控件(如 CStatic 或自定義 CWnd)的子窗口。
  3. 調整外部窗口樣式:移除 WS_POPUP、WS_CAPTION 等,添加 WS_CHILD、WS_VISIBLE。
  4. 在 MFC 窗口調整大小時,同步移動/縮放外部窗口(處理 WM_SIZE 消息)。

關鍵代碼片段

// 啟動並嵌入
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.lpFile = L"notepad.exe";
sei.nShow = SW_SHOW;
ShellExecuteEx(&sei);

// 等待窗口創建...
HWND hExt = FindWindow(NULL, L"無標題 - 記事本");
if (hExt) {
    SetParent(hExt, m_placeholder.GetSafeHwnd()); // m_placeholder 是佔位控件
    LONG style = GetWindowLong(hExt, GWL_STYLE);
    style &= ~(WS_POPUP | WS_CAPTION | WS_THICKFRAME);
    style |= WS_CHILD | WS_VISIBLE;
    SetWindowLong(hExt, GWL_STYLE, style);
    MoveWindow(hExt, 0, 0, width, height, TRUE);
}

注意事項

  • 部分程序(如受保護的系統進程)不允許重新設置父窗口。
  • 嵌入後,外部程序的菜單、快捷鍵可能失效,需評估用戶體驗。
  • 考慮使用 ActiveX/COM 技術(如 WebBrowser 控件)實現更原生的文檔嵌入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved