首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 應用程式啟動時強制登入對話框:阻擋主視窗顯示直到驗證通過

     編輯:關於VC++

許多商業軟體需在啟動時驗證使用者身分,僅允許合法帳密進入系統。本文示範在 MFC SDI 架構下,於 CView::OnInitialUpdate 彈出模態登入對話框,驗證失敗則循環提示或取消啟動,成功才讓主視窗顯示。

一、架構設計

  • CLoginTestApp (衍生 CWinApp) 新增 BOOL m_bSuccessLogin 標記登入狀態。
  • CLoginTestView::OnInitialUpdate 執行登入邏輯(最早可攔截視窗顯示的虛擬函式)。
  • InitInstance 根據 m_bSuccessLogin 決定是否 ShowWindow 主視窗,否則銷毀視窗並返回 FALSE 終止應用程式。

二、核心程式碼

1. 登入對話框類別

class CLoginDlg : public CDialog {
public:
    CString m_strUserName, m_strUserPwd;
    BOOL m_bCancel = FALSE;
    // DDX 控制項綁定...
    afx_msg void OnCancel() { m_bCancel = TRUE; CDialog::OnCancel(); }
};

2. View 中驗證邏輯

void CLoginTestView::OnInitialUpdate() {
    CView::OnInitialUpdate();
    CLoginTestApp* pApp = (CLoginTestApp*)AfxGetApp();
    CLoginDlg dlg;

    while (true) {
        dlg.m_strUserName = dlg.m_strUserPwd = _T("");
        if (dlg.DoModal() != IDOK) { // 使用者按取消
            pApp->m_bSuccessLogin = FALSE;
            return;
        }
        // 簡單驗證:帳號 aa / 密碼 bb
        if (dlg.m_strUserName == _T("aa") && dlg.m_strUserPwd == _T("bb")) {
            pApp->m_bSuccessLogin = TRUE;
            return;
        }
        AfxMessageBox(_T("帳號或密碼錯誤!"));
        // 循環重試
    }
}

3. App 控制主視窗顯示

BOOL CLoginTestApp::InitInstance() {
    // ... 標準初始化 ...
    CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(...);
    AddDocTemplate(pDocTemplate);
    
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    if (!ProcessShellCommand(cmdInfo)) return FALSE; // 建立主視窗但未顯示

    // 關鍵:根據登入結果決定是否顯示
    if (m_bSuccessLogin) {
        m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
        m_pMainWnd->UpdateWindow();
        return TRUE;
    } else {
        delete m_pMainWnd; // 銷毀已建立的主視窗
        m_pMainWnd = NULL;
        return FALSE;      // 終止應用程式
    }
}

三、執行流程圖解

  1. App InitInstance 建立 Doc/View/Frame 架構,ProcessShellCommand 完成主視窗建立(但未 ShowWindow)。
  2. View OnInitialUpdate 被呼叫,彈出模態登入對話框(阻塞主執行緒)。
  3. 驗證成功 → m_bSuccessLogin=TRUE → 返回 InitInstance → ShowWindow 主視窗。
  4. 驗證失敗/取消 → m_bSuccessLogin=FALSE → 返回 InitInstance → 刪除主視窗 → 返回 FALSE → 應用程式退出。
登入對話框介面

圖 1:登入對話框,輸入 aa/bb 即可進入

四、安全性增強建議

  • 密碼不應硬編碼,應採用雜湊比對(MD5/SHA256 + Salt)。
  • 加入嘗試次數限制,超過鎖定一段時間。
  • 支援「記住我」:將加密憑證寫入註冊表/設定檔,下次自動嘗試。
  • 整合 Windows 認證(SSPI/Kerberos)實現單一登入 (SSO)。
  • 釋出版移除測試帳號,改用正式授權驗證機制。

五、適用場景與限制

優點缺點
邏輯簡單、MFC 原生、無需額外執行緒僅適用 SDI/MDI 架構,對話框式專案需調整
主視窗完全不顯示,無閃爍阻塞主執行緒,無法顯示啟動畫面/進度條
易於擴充驗證邏輯若登入需網路請求,會凍結 UI,建議改用非同步模式

六、總結

利用 CView::OnInitialUpdate 早期攔截點與 CWinApp::m_bSuccessLogin 狀態旗標,即可以極少代碼實現啟動強制登入。此模式適用於桌面端工具、內部管理系統等需輕量級存取控制的場景。完整專案已在 VS.NET / VC6.0 / Win98/2K/XP 測試通過。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved