安裝軟體時常需輸入格式為 XXXX-XXXX-XXXX-XXXX 的序號(SN),卻無法一次貼上,必須分段複製貼上,極為繁瑣。市面上有 SNCopy 等工具解決此問題,原理其實不複雜:熱鍵觸發 → 讀取完整序號 → 依分隔符或固定長度切割 → 逐段寫入剪貼板 → 模擬 Ctrl+V + Tab 自動填入。本文完整示範如何用 VC++ (MFC 對話框專案) 從零打造這類工具。
建立 MFC 對話框專案 Snpaste。在 OnInitDialog() 中註冊 Shift+V 為全域熱鍵:
if (!::RegisterHotKey(this->GetSafeHwnd(), 0x3333, MOD_SHIFT, 0x56)) {
AfxMessageBox(_T("熱鍵註冊失敗!"));
this->CloseWindow();
}
在 OnClose() 註銷熱鍵:::UnregisterHotKey(this->GetSafeHwnd(), 0x3333);
OnHotKey覆寫 WindowProc 或使用 ON_MESSAGE(WM_HOTKEY, OnHotKey) 捕捉熱鍵:
OpenClipboard() 失敗則彈窗提示。CString str = (char*)::GetClipboardData(CF_TEXT); 並 Trim() 去除空白。Find('-') 迴圈切割,每段送入剪貼板 → SendStrToClipboard → PerformCtrlV → PerformClickTab。m_spinctrl.GetPos()) 切割。Sleep(100),避免剪貼板讀寫競爭導致資料錯誤。void CSnpasteDlg::PerformCtrlV() {
keybd_event(VK_CONTROL, 0, 0, 0); // 按下 Ctrl
keybd_event(0x56, 0, 0, 0); // 按下 V
keybd_event(0x56, 0, KEYEVENTF_KEYUP, 0); // 放開 V
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); // 放開 Ctrl
}
void CSnpasteDlg::PerformClickTab() {
keybd_event(VK_TAB, 0, 0, 0);
keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0);
}
void CSnpasteDlg::SendStrToClipboard(CString str) {
if (!OpenClipboard()) return;
EmptyClipboard();
HGLOBAL hglo = GlobalAlloc(GPTR, str.GetLength() + 1);
LPBYTE pByte = (LPBYTE)GlobalLock(hglo);
memcpy(pByte, str.GetBuffer(), str.GetLength());
str.ReleaseBuffer();
GlobalUnlock(hglo);
SetClipboardData(CF_TEXT, hglo);
CloseClipboard();
}
程式在 VC++ 7.1 編譯通過。使用時:複製完整序號 → 將游標置於第一個輸入框 → 按 Shift+V → 全自動填入並跳欄。好創意往往是成功的一半,這類小工具雖簡單,卻能大幅提升重複性工作的效率,極適合作為 MFC 初學者的實戰練習專案。