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

VC/MFC 實現文字「打字機效果」:模擬鍵盤事件逐字輸出

     編輯:程式設計綜合問答

需求

建立文字檔,自動逐字寫入內容,呈現如人工逐鍵輸入的動畫效果。

核心思路:模擬鍵盤輸入

MFC/Win32 無直接「打字機 API」,但可用 `keybd_event` 或 `SendInput` 模擬鍵盤訊息發送給目標視窗(如記事本、自訂編輯框)。

關鍵 API

// 舊版,仍常用
void keybd_event(BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo);

// 推薦:Win8+ 更精確
UINT SendInput(UINT nInputs, LPINPUT pInputs, int cbSize);

實作範圍(MFC 對話框專案)

void CMyDlg::OnTypewriterEffect()
{
    CString text = _T("Hello, Typewriter!");
    // 1. 啟動記事本或聚焦目標編輯框
    ShellExecute(NULL, _T("open"), _T("notepad.exe"), NULL, NULL, SW_SHOW);
    Sleep(500); // 等待視窗就緒

    // 2. 逐字發送鍵盤事件
    for (int i = 0; i < text.GetLength(); ++i)
    {
        TCHAR ch = text[i];
        // 簡易處理:僅支援 ASCII 可列印字元
        if (ch >= _T(' ') && ch <= _T('~'))
        {
            // 模擬按下
            keybd_event(VkKeyScan(ch), 0, 0, 0);
            Sleep(50); // 打字間隔
            // 模擬釋放
            keybd_event(VkKeyScan(ch), 0, KEYEVENTF_KEYUP, 0);
            Sleep(30);
        }
        else if (ch == _T('\n'))
        {
            keybd_event(VK_RETURN, 0, 0, 0);
            Sleep(50);
            keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
        }
        // 處理 Shift 組合鍵(大寫、符號)需額外邏輯...
    }
}

進階建議

  • 使用 `SendInput` 組合 `INPUT_KEYBOARD` 結構,支援 Unicode、組合鍵、更精確的時序。
  • 若目標是自家 MFC 編輯框 (`CEdit`),**直接用 `SetTimer` + `ReplaceSel` 逐字追加文字** 更簡單、不依賴焦點、無權限問題:
// 自家編輯框打字機效果(推薦)
void CMyDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == 1 && pos < text.GetLength())
    {
        m_edit.SetSel(-1, -1); // 移至末尾
        m_edit.ReplaceSel(text.Mid(pos, 1));
        ++pos;
    }
    else KillTimer(1);
}

總結

外部程式(記事本)用 `keybd_event`/`SendInput` 模擬鍵盤;自家控制項用 `Timer + ReplaceSel` 逐字追加。後者更穩定、可控、無需管理員權限。

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