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

VC++ 打造序號自動填寫神器:熱鍵觸發、剪貼板分解與鍵盤模擬全解析

     編輯:VC 教學

痛點與靈感

安裝軟體時常需輸入格式為 XXXX-XXXX-XXXX-XXXX 的序號(SN),卻無法一次貼上,必須分段複製貼上,極為繁瑣。市面上有 SNCopy 等工具解決此問題,原理其實不複雜:熱鍵觸發 → 讀取完整序號 → 依分隔符或固定長度切割 → 逐段寫入剪貼板 → 模擬 Ctrl+V + Tab 自動填入。本文完整示範如何用 VC++ (MFC 對話框專案) 從零打造這類工具。

核心實作步驟

1. 專案建立與熱鍵註冊

建立 MFC 對話框專案 Snpaste。在 OnInitDialog() 中註冊 Shift+V 為全域熱鍵:

if (!::RegisterHotKey(this->GetSafeHwnd(), 0x3333, MOD_SHIFT, 0x56)) {
    AfxMessageBox(_T("熱鍵註冊失敗!"));
    this->CloseWindow();
}

在 OnClose() 註銷熱鍵:::UnregisterHotKey(this->GetSafeHwnd(), 0x3333);

2. 熱鍵訊息處理 OnHotKey

覆寫 WindowProc 或使用 ON_MESSAGE(WM_HOTKEY, OnHotKey) 捕捉熱鍵:

  • 開啟剪貼板:OpenClipboard() 失敗則彈窗提示。
  • 取得文字:CString str = (char*)::GetClipboardData(CF_TEXT); 並 Trim() 去除空白。
  • 分割策略:
    • 含連字號:Find('-') 迴圈切割,每段送入剪貼板 → SendStrToClipboard → PerformCtrlV → PerformClickTab。
    • 無連字號:依使用者設定的固定長度 (m_spinctrl.GetPos()) 切割。
  • 延遲處理:每段操作間 Sleep(100),避免剪貼板讀寫競爭導致資料錯誤。
  • 還原剪貼板:最後將原始完整序號寫回剪貼板,不干擾使用者後續操作。

3. 鍵盤模擬輔助函式

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);
}

4. 寫入剪貼板工具函式

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 初學者的實戰練習專案。

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