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

C# 開發序列號快速輸入工具:全局熱鍵 + 剪貼板 + SendKeys

     編輯:關於C語言

需求場景

許多軟件註冊需輸入形如 XXXXX-XXXXX-XXXX-XXXX 的序列號,通常界面提供多個文本框逐段輸入。手工分段複製極其繁瑣,本工具實現:複製完整序列號 → 光標定位首框 → 按熱鍵 → 自動分段填入並 Tab 切換。

核心技術棧

  1. 全局熱鍵註冊:P/Invoke user32.dll RegisterHotKey/UnregisterHotKey
  2. 剪貼板讀取:System.Windows.Forms.Clipboard.GetText()
  3. 按鍵模擬:System.Windows.Forms.SendKeys.Send() (內部封裝 keybd_event)
  4. Windows 消息循環攔截:重寫 WndProc 捕獲 WM_HOTKEY (0x0312)

完整代碼實現


using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace SNInputTool
{
    public class MainForm : Form
    {
        #region P/Invoke
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        private const int WM_HOTKEY = 0x0312;
        private const int HOTKEY_ID = 100;
        #endregion

        private string _snBuffer;

        public MainForm()
        {
            InitializeUI();
        }

        private void InitializeUI()
        {
            this.Text = "SN 快速輸入工具 v1.0";
            this.ClientSize = new Size(300, 200);
            this.FormBorderStyle = FormBorderStyle.FixedSingle;
            this.MaximizeBox = false;
            
            var lbl = new Label 
            { 
                Text = "使用說明:\n1. 複製完整 SN (如 XXXX-XXXX-XXXX-XXXX)\n2. 點擊目標輸入框第一格\n3. 按 F10 自動填入", 
                AutoSize = true, 
                Location = new Point(20, 20),
                Font = new Font("微軟雅黑", 9)
            };
            this.Controls.Add(lbl);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Clipboard.Clear(); // 防止殘留干擾
            // 註冊 F10 (無修飾鍵)
            if (!RegisterHotKey(this.Handle, HOTKEY_ID, 0, (uint)Keys.F10))
            {
                MessageBox.Show("熱鍵註冊失敗,可能被佔用。請嘗試修改鍵碼。");
            }
        }

        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            UnregisterHotKey(this.Handle, HOTKEY_ID);
            base.OnFormClosing(e);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == HOTKEY_ID)
            {
                ProcessHotkey();
            }
            base.WndProc(ref m);
        }

        private void ProcessHotkey()
        {
            try
            {
                // 1. 獲取剪貼板文本
                _snBuffer = Clipboard.GetText();
                if (string.IsNullOrWhiteSpace(_snBuffer))
                {
                    SystemSounds.Beep.Play();
                    return;
                }

                // 2. 將分隔符替換為 Tab 鍵標記
                // SendKeys 語法: {TAB} 代表 Tab 鍵
                string sendText = _snBuffer.Replace("-", "{TAB}").Replace(" ", "{TAB}");
                
                // 3. 發送模擬按鍵
                SendKeys.SendWait(sendText); // SendWait 等待處理完成
            }
            catch (Exception ex)
            {
                MessageBox.Show($"處理失敗: {ex.Message}");
            }
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

關鍵細節解析

環節說明
熱鍵衝突處理RegisterHotKey 返回 false 表示失敗,建議提供設置界面讓用戶自定義 (如 Ctrl+Alt+S)
剪貼板格式僅處理文本格式;若包含圖片/文件,GetText() 返回空
分隔符擴展除 - 外,常見空格、下劃線、冒號也應替換為 {TAB}
SendKeys 限制需目標窗口擁有焦點;UAC 提升權限窗口無法注入;某些 DirectX/電子游戲窗口無效
SendWait vs SendSendWait 同步等待消息泵處理完畢,避免字符串過長導致丟字符
國際化鍵盤佈局SendKeys 發送虛擬鍵碼,受當前輸入法/鍵盤佈局影響,建議臨時切換至美式鍵盤

進階擴展建議

  1. 系統托盤常駐:NotifyIcon 最小化到托盤,右鍵菜單「退出」
  2. 多格式識別:正則提取連續字母數字段,自動忽略分隔符
  3. 歷史記錄:保存最近 N 個 SN,提供下拉選擇重發
  4. 管理員權限自動提升:清單註冊 requireAdministrator,配合 UIAccess 注入高權限窗口
  5. WPF 版本:同樣 P/Invoke,但用 Windows.Forms.SendKeys 需引用 System.Windows.Forms

安全與合規提醒

  • 僅用於合法軟件註冊、測試環境部署
  • 嚴禁用於破解、繞過授權、批量註冊帳號等違規行為
  • 企業環境部署請簽名發布,避免被殺毒軟件誤報

總結

本工具展示了 Windows 桌面自動化的經典組合:全局熱鍵 + 剪貼板 + SendKeys。代碼簡潔但涵蓋 P/Invoke、消息循環、跨進程輸入模擬等核心技術。理解其原理與限制,可擴展構建更強大的自動化腳本(如表單自動填充、測試數據注入)。

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