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

MFC 程序中 FindWindow 導致 0xC0000005 訪問衝突的根因與修復

     編輯:程式設計綜合問答

錯誤現場

在按鈕點擊事件中嘗試查找記事本窗口並置前台:

void C123Dlg::OnBnClickedButton1() {
    www = FindWindow(L"無標題 - 記事本", NULL);
    www->SetForegroundWindow(); // 此處拋出 0xC0000005 異常
}

異常信息:0x003c0774 處未經處理的異常,0xc0000005: 讀取位置 0x00000020 時發生訪問衝突。

根因分析

核心原因:FindWindow 返回 NULL,導致後續對空指針調用 SetForegroundWindow。

  • 窗口標題必須完全匹配(包含空格、大小寫),"無標題 - 記事本" 僅在未保存文件時出現
  • 若記事本已最小化到托盤或以管理員權限運行,普通權限程序無法獲取句柄
  • 類成員變量 CWnd* www 未初始化,若複用可能殘留野指針

修復方案

void C123Dlg::OnBnClickedButton1() {
    // 1. 使用類名 "Notepad" 替代標題,提高匹配率
    CWnd* pWnd = CWnd::FindWindow(L"Notepad", NULL);
    
    // 2. 必須進行空指針檢查
    if (pWnd != NULL && pWnd->GetSafeHwnd() != NULL) {
        pWnd->SetForegroundWindow();
    } else {
        AfxMessageBox(_T("未找到記事本窗口,請確認已打開"));
    }
}

最佳實踐建議

  1. 優先使用類名(如 #32770 對話框、Notepad)而非標題查找
  2. 結合 EnumWindows 遍歷所有頂層窗口,通過 GetWindowText 模糊匹配
  3. 若需跨進程操作 UI,請啟用 UI Automation 或發送 WM_COPYDATA 消息
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved