許多軟件註冊需輸入形如 XXXXX-XXXXX-XXXX-XXXX 的序列號,通常界面提供多個文本框逐段輸入。手工分段複製極其繁瑣,本工具實現:複製完整序列號 → 光標定位首框 → 按熱鍵 → 自動分段填入並 Tab 切換。
user32.dll RegisterHotKey/UnregisterHotKeySystem.Windows.Forms.Clipboard.GetText()System.Windows.Forms.SendKeys.Send() (內部封裝 keybd_event)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 Send | SendWait 同步等待消息泵處理完畢,避免字符串過長導致丟字符 |
| 國際化鍵盤佈局 | SendKeys 發送虛擬鍵碼,受當前輸入法/鍵盤佈局影響,建議臨時切換至美式鍵盤 |
NotifyIcon 最小化到托盤,右鍵菜單「退出」requireAdministrator,配合 UIAccess 注入高權限窗口Windows.Forms.SendKeys 需引用 System.Windows.Forms本工具展示了 Windows 桌面自動化的經典組合:全局熱鍵 + 剪貼板 + SendKeys。代碼簡潔但涵蓋 P/Invoke、消息循環、跨進程輸入模擬等核心技術。理解其原理與限制,可擴展構建更強大的自動化腳本(如表單自動填充、測試數據注入)。