建立文字檔,自動逐字寫入內容,呈現如人工逐鍵輸入的動畫效果。
MFC/Win32 無直接「打字機 API」,但可用 `keybd_event` 或 `SendInput` 模擬鍵盤訊息發送給目標視窗(如記事本、自訂編輯框)。
// 舊版,仍常用
void keybd_event(BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo);
// 推薦:Win8+ 更精確
UINT SendInput(UINT nInputs, LPINPUT pInputs, int cbSize);
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 組合鍵(大寫、符號)需額外邏輯...
}
}
// 自家編輯框打字機效果(推薦)
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` 逐字追加。後者更穩定、可控、無需管理員權限。