【C#】字符串轉換爲鍵盤按鍵鍵碼值,模擬鍵盤按鍵輸入,附按鍵鍵碼錶


前言

網上搜了一圈沒現成的,乾脆寫一個方便使用好了。
環境:.Net Framework 4.0,VS2010

鍵盤鍵碼值參考了:
C#窗體如何通過keybd_event()函數模擬鍵盤按鍵(組合鍵)產生事件


1. 鍵盤鍵碼值

爲了調用windows系統的keybd_event,鍵碼的值都是byte類型

/// <summary>
/// 枚舉類型,鍵盤按鍵的鍵碼值
/// </summary>
public enum KeyValueEnum : byte
{
    //常用鍵:字母鍵A到Z
    vbKeyA = 65 ,
    vbKeyB = 66 ,
    vbKeyC = 67 ,
    vbKeyD = 68 ,
    vbKeyE = 69 ,
    vbKeyF = 70 ,
    vbKeyG = 71 ,
    vbKeyH = 72 ,
    vbKeyI = 73 ,
    vbKeyJ = 74 , 
    vbKeyK = 75 ,
    vbKeyL = 76 ,
    vbKeyM = 77 ,
    vbKeyN = 78 ,
    vbKeyO = 79 ,
    vbKeyP = 80 ,
    vbKeyQ = 81 ,
    vbKeyR = 82 ,
    vbKeyS = 83 ,
    vbKeyT = 84 ,
    vbKeyU = 85 ,
    vbKeyV = 86 ,
    vbKeyW = 87 ,
    vbKeyX = 88 ,
    vbKeyY = 89 ,
    vbKeyZ = 90 ,

    // 數字鍵盤:0 - 9
    vbKey0 = 48 ,    // 0 鍵
    vbKey1 = 49 ,    // 1 鍵
    vbKey2 = 50 ,    // 2 鍵
    vbKey3 = 51 ,    // 3 鍵
    vbKey4 = 52 ,    // 4 鍵
    vbKey5 = 53 ,    // 5 鍵
    vbKey6 = 54 ,    // 6 鍵
    vbKey7 = 55 ,    // 7 鍵
    vbKey8 = 56 ,    // 8 鍵
    vbKey9 = 57 ,    // 9 鍵

     // 小鍵盤按鍵
     vbKeyNumpad0 = 0x60 ,    // 0 鍵
     vbKeyNumpad1 = 0x61 ,    // 1 鍵
     vbKeyNumpad2 = 0x62 ,    // 2 鍵
     vbKeyNumpad3 = 0x63 ,    // 3 鍵
     vbKeyNumpad4 = 0x64 ,    // 4 鍵
     vbKeyNumpad5 = 0x65 ,    // 5 鍵
     vbKeyNumpad6 = 0x66 ,    // 6 鍵
     vbKeyNumpad7 = 0x67 ,    // 7 鍵
     vbKeyNumpad8 = 0x68 ,    // 8 鍵
     vbKeyNumpad9 = 0x69 ,    // 9 鍵
     vbKeyMultiply = 0x6A ,   // MULTIPLICATIONSIGN(*)鍵
     vbKeyAdd = 0x6B ,        // PLUS SIGN(+) 鍵
     vbKeySeparator = 0x6C ,  // ENTER 鍵
     vbKeySubtract = 0x6D ,   // MINUS SIGN(-) 鍵
     vbKeyDecimal = 0x6E ,    // DECIMAL POINT(.) 鍵
     vbKeyDivide = 0x6F ,     // DIVISION SIGN(/) 鍵


     // F1到F12按鍵
     vbKeyF1 = 0x70 ,   // F1 鍵
     vbKeyF2 = 0x71 ,   // F2 鍵
     vbKeyF3 = 0x72 ,   // F3 鍵
     vbKeyF4 = 0x73 ,   // F4 鍵
     vbKeyF5 = 0x74 ,   // F5 鍵
     vbKeyF6 = 0x75 ,   // F6 鍵
     vbKeyF7 = 0x76 ,   // F7 鍵
     vbKeyF8 = 0x77 ,   // F8 鍵
     vbKeyF9 = 0x78 ,   // F9 鍵
     vbKeyF10 = 0x79 ,  // F10 鍵
     vbKeyF11 = 0x7A ,  // F11 鍵
     vbKeyF12 = 0x7B ,  // F12 鍵

     // 其他常用按鍵
     vbKeyLButton = 0x1,    // 鼠標左鍵
     vbKeyRButton = 0x2,    // 鼠標右鍵
     vbKeyCancel = 0x3,     // CANCEL 鍵
     vbKeyMButton = 0x4,    // 鼠標中鍵
     vbKeyBack = 0x8,       // BACKSPACE 鍵
     vbKeyTab = 0x9,        // TAB 鍵
     vbKeyClear = 0xC,      // CLEAR 鍵
     vbKeyReturn = 0xD,     // ENTER 鍵
     vbKeyShift = 0x10,     // SHIFT 鍵
     vbKeyControl = 0x11,   // CTRL 鍵
     vbKeyAlt = 18,         // Alt 鍵  (鍵碼18)
     vbKeyMenu = 0x12,      // MENU 鍵
     vbKeyPause = 0x13,     // PAUSE 鍵
     vbKeyCapital = 0x14,   // CAPS LOCK 鍵
     vbKeyEscape = 0x1B,    // ESC 鍵
     vbKeySpace = 0x20,     // SPACEBAR 鍵
     vbKeyPageUp = 0x21,    // PAGE UP 鍵
     vbKeyEnd = 0x23,       // End 鍵
     vbKeyHome = 0x24,      // HOME 鍵
     vbKeyLeft = 0x25,      // LEFT ARROW 鍵
     vbKeyUp = 0x26,        // UP ARROW 鍵
     vbKeyRight = 0x27,     // RIGHT ARROW 鍵
     vbKeyDown = 0x28,      // DOWN ARROW 鍵
     vbKeySelect = 0x29,    // Select 鍵
     vbKeyPrint = 0x2A,     // PRINT SCREEN 鍵
     vbKeyExecute = 0x2B,   // EXECUTE 鍵
     vbKeySnapshot = 0x2C,  // SNAPSHOT 鍵
     vbKeyDelete = 0x2E,    // Delete 鍵
     vbKeyHelp = 0x2F,      // HELP 鍵
     vbKeyNumlock = 0x90   // NUM LOCK 鍵
}


2. 轉換方法

遍歷字符串的每個字符:
先把每個字符都轉換爲大寫:str[i].ToString().ToUpper()
再給字符加上前綴"vbKey":string.Concat(“vbKey”, str[i].ToString().ToUpper())
然後根據每個生成的字符串(比如“a”變成了“vbKeyA”)到枚舉類型KeyValueEnum中查找對應鍵碼:(byte)Enum.Parse(typeof(KeyValueEnum), str)
鍵碼添加到集合kvList:kvList.Add
最後返回包含了字符串中每個字符的鍵碼的集合kvList。
C#中如何將字符串string轉換成枚舉類型 – typeof()以及Enum.Parse()的用法
*另:try…catch之類的請先加在這個方法外部,檢測待轉換字符串內容的那些還是別放進來吧。

/// <summary>
/// 字符串轉換爲鍵碼值的集合
/// </summary>
/// <param name="str">待轉換的字符串</param>
/// <returns>返回鍵碼集合</returns>
public ArrayList GetKeyValues(string str)
{
    ArrayList kvList = new ArrayList();
    for (int i = 0; i < str.Length; i++ )
    {
        kvList.Add((byte)Enum.Parse(
            typeof(KeyValueEnum), string.Concat("vbKey", str[i].ToString().ToUpper())));
    }
    return kvList;
}

3. 測試

在WPF使用,直接彈窗口查看查找到的鍵碼。在Form或其他使用的話請自己修改彈窗語句。

// 待轉換的字符串
string str = "ab123t";
// 遍歷字符串的每個字符
for (int i = 0; i < str.Length; i++)
{
	MessageBox.Show(str[i] + ": " + GetKeyValues(str)[i].ToString());
}

4. 模擬鍵盤按鍵輸入

即代替手動按鍵盤按鍵。

string userName = "user123";
for (int i = 0; i < userName.Length; i++)
{
    InputOneKey((byte)GetKeyValues(userName)[i]);
}

/// <summary>
/// 輸入鍵盤上的一個字符,即按下一次鍵盤上的一個按鍵
/// </summary>
/// <param name="keyValue">用鍵碼錶示</param>
public void InputOneKey(byte keyValue) {
	// 按下
	keybd_event(keyValue, 0, 0, 0); 
	// 釋放      
	keybd_event(keyValue, 0, 2, 0);        
}

模擬鍵盤輸入API:keybd_event:

/// <summary>
/// 模擬鍵盤輸入API:keybd_event
/// </summary>
/// <param name="bVk">虛擬鍵值</param>
/// <param name="bScan">一般爲0</param>
/// <param name="dwFlags">整數類型:按下0,釋放2</param>
/// <param name="dwExtraInfo">整數類型:一般情況下設成爲0</param>
[DllImport("user32.dll", EntryPoint = "keybd_event")]
public static extern void keybd_event(
	byte bVk,    //虛擬鍵值
	byte bScan,  // 一般爲0
	int dwFlags,  //這裏是整數類型  0 爲按下,2爲釋放
	int dwExtraInfo  //這裏是整數類型 一般情況下設成爲 0
);

5. 附:按鍵鍵碼錶

網上的不夠完整,這裏加了剩下的符號按鍵進去(WIN鍵之類)。

微軟在線文檔:Keycode constants
微軟在線文檔:Virtual-Key Codes

#region 鍵碼 bVk參數 常量定義
/// <summary>
/// 鼠標左鍵
/// </summary>
public const byte vbKeyLButton = 0x1;    // 鼠標左鍵
/// <summary>
/// 鼠標右鍵
/// </summary>
public const byte vbKeyRButton = 0x2;    // 鼠標右鍵
/// <summary>
/// CANCEL 鍵
/// </summary>
public const byte vbKeyCancel = 0x3;     // CANCEL 鍵
/// <summary>
/// 鼠標中鍵
/// </summary>
public const byte vbKeyMButton = 0x4;    // 鼠標中鍵
/// <summary>
/// BACKSPACE 鍵
/// </summary>
public const byte vbKeyBack = 0x8;       // BACKSPACE 鍵
/// <summary>
/// TAB 鍵
/// </summary>
public const byte vbKeyTab = 0x9;        // TAB 鍵
public const byte vbKeyClear = 0xC;      // CLEAR 鍵
/// <summary>
/// ENTER 鍵
/// </summary>
public const byte vbKeyReturn = 0xD;     // ENTER 鍵
public const byte vbKeyShift = 0x10;     // SHIFT 鍵
public const byte vbKeyControl = 0x11;   // CTRL 鍵
public const byte vbKeyAlt = 18;         // Alt 鍵  (鍵碼18)
public const byte vbKeyMenu = 0x12;      // MENU 鍵
public const byte vbKeyPause = 0x13;     // PAUSE 鍵
/// <summary>
/// CAPS LOCK 鍵
/// </summary>
public const byte vbKeyCapital = 0x14;   // CAPS LOCK 鍵
public const byte vbKeyEscape = 0x1B;    // ESC 鍵
public const byte vbKeySpace = 0x20;     // SPACEBAR 鍵
public const byte vbKeyPageUp = 0x21;    // PAGE UP 鍵
public const byte vbKeyEnd = 0x23;       // End 鍵
public const byte vbKeyHome = 0x24;      // HOME 鍵
public const byte vbKeyLeft = 0x25;      // LEFT ARROW 鍵
public const byte vbKeyUp = 0x26;        // UP ARROW 鍵
public const byte vbKeyRight = 0x27;     // RIGHT ARROW 鍵
public const byte vbKeyDown = 0x28;      // DOWN ARROW 鍵
public const byte vbKeySelect = 0x29;    // Select 鍵
public const byte vbKeyPrint = 0x2A;     // PRINT SCREEN 鍵
public const byte vbKeyExecute = 0x2B;   // EXECUTE 鍵
public const byte vbKeySnapshot = 0x2C;  // SNAPSHOT 鍵
public const byte vbKeyDelete = 0x2E;    // Delete 鍵
public const byte vbKeyHelp = 0x2F;      // HELP 鍵
public const byte vbKeyNumlock = 0x90;   // NUM LOCK 鍵

/// <summary>
/// 左邊的 WIN 鍵
/// </summary>
public const byte vbKeyLWin = 0x91;     // 左邊的 WIN 鍵
/// <summary>
/// 右邊的 WIN 鍵
/// </summary>
public const byte vbKeyRWin = 0x91;     // 右邊的 WIN 鍵
/// <summary>
/// 右Ctrl左邊鍵,點擊相當於點擊鼠標右鍵,會彈出快捷菜單
/// </summary>
public const byte vbKeyApps = 0x93;     // 右Ctrl左邊鍵,點擊相當於點擊鼠標右鍵,會彈出快捷菜單
/// <summary>
/// 分號 ; 
/// </summary>
public const byte vbKeySemicolon = 0xBA;    // ;(分號)
/// <summary>
/// 等號/加號 鍵
/// </summary>
public const byte vbKeyEqual = 0xBB;        // 等號/加號鍵

// 常用鍵:字母鍵 A-Z
public const byte vbKeyA = 65;
public const byte vbKeyB = 66;
public const byte vbKeyC = 67;
public const byte vbKeyD = 68;
public const byte vbKeyE = 69;
public const byte vbKeyF = 70;
public const byte vbKeyG = 71;
public const byte vbKeyH = 72;
public const byte vbKeyI = 73;
public const byte vbKeyJ = 74;
public const byte vbKeyK = 75;
public const byte vbKeyL = 76;
public const byte vbKeyM = 77;
public const byte vbKeyN = 78;
public const byte vbKeyO = 79;
public const byte vbKeyP = 80;
public const byte vbKeyQ = 81;
public const byte vbKeyR = 82;
public const byte vbKeyS = 83;
public const byte vbKeyT = 84;
public const byte vbKeyU = 85;
public const byte vbKeyV = 86;
public const byte vbKeyW = 87;
public const byte vbKeyX = 88;
public const byte vbKeyY = 89;
public const byte vbKeyZ = 90;

// 數字鍵盤:0 - 9
public const byte vbKey0 = 48;    // 0 鍵
public const byte vbKey1 = 49;    // 1 鍵
public const byte vbKey2 = 50;    // 2 鍵
public const byte vbKey3 = 51;    // 3 鍵
public const byte vbKey4 = 52;    // 4 鍵
public const byte vbKey5 = 53;    // 5 鍵
public const byte vbKey6 = 54;    // 6 鍵
public const byte vbKey7 = 55;    // 7 鍵
public const byte vbKey8 = 56;    // 8 鍵
public const byte vbKey9 = 57;    // 9 鍵

// 小鍵盤
public const byte vbKeyNumpad0 = 0x60;    //0 鍵
public const byte vbKeyNumpad1 = 0x61;    //1 鍵
public const byte vbKeyNumpad2 = 0x62;    //2 鍵
public const byte vbKeyNumpad3 = 0x63;    //3 鍵
public const byte vbKeyNumpad4 = 0x64;    //4 鍵
public const byte vbKeyNumpad5 = 0x65;    //5 鍵
public const byte vbKeyNumpad6 = 0x66;    //6 鍵
public const byte vbKeyNumpad7 = 0x67;    //7 鍵
public const byte vbKeyNumpad8 = 0x68;    //8 鍵
public const byte vbKeyNumpad9 = 0x69;    //9 鍵
/// <summary>
/// 小鍵盤,MULTIPLICATIONSIGN(*)鍵
/// </summary>
public const byte vbKeyMultiply = 0x6A;   // MULTIPLICATIONSIGN(*)鍵
/// <summary>
/// 小鍵盤,PLUS SIGN(+) 鍵
/// </summary>
public const byte vbKeyAdd = 0x6B;        // PLUS SIGN(+) 鍵
/// <summary>
/// 小鍵盤,ENTER 鍵
/// </summary>
public const byte vbKeySeparator = 0x6C;  // ENTER 鍵
/// <summary>
/// 小鍵盤,MINUS SIGN(-) 鍵
/// </summary>
public const byte vbKeySubtract = 0x6D;   // MINUS SIGN(-) 鍵
/// <summary>
/// 小鍵盤,DECIMAL POINT(.) 鍵
/// </summary>
public const byte vbKeyDecimal = 0x6E;    // DECIMAL POINT(.) 鍵
/// <summary>
/// 小鍵盤,DIVISION SIGN(/) 鍵
/// </summary>
public const byte vbKeyDivide = 0x6F;     // DIVISION SIGN(/) 鍵
/// <summary>
/// ,鍵(逗號)
/// </summary>
public const byte vbKeyComma = 0xBC;      // ,鍵(逗號)
/// <summary>
/// -鍵(減號)
/// </summary>
public const byte vbKeyMinus = 0xBD;      // -鍵(減號)
/// <summary>
/// .鍵(句號)
/// </summary>
public const byte vbKeyPeriod = 0xBE;   // .鍵(句號)
/// <summary>
/// 斜槓/和問號? 鍵
/// </summary>
public const byte vbKeySlash = 0xBF;    // 斜槓/和問號? 鍵
/// <summary>
/// `鍵(Esc下面)
/// </summary>
public const byte vbKeyTilde = 0xC0;    // `鍵(Esc下面)
/// <summary>
/// [ 鍵
/// </summary>
public const byte vbKeyLeftBracket = 0xDB;  // [ 鍵
/// <summary>
/// ] 鍵
/// </summary>
public const byte vbKeyRightBracket = 0xDD;  // ] 鍵
/// <summary>
/// 反斜槓\ 鍵
/// </summary>
public const byte vbKeyBackSlash = 0xDC;    // 反斜槓\鍵
/// <summary>
/// 單/雙引號 ' " 鍵
/// </summary>
public const byte vbKeyQuote = 0xDE;        // 單/雙引號 ' " 鍵


//F1到F12按鍵
public const byte vbKeyF1 = 0x70;   //F1 鍵
public const byte vbKeyF2 = 0x71;   //F2 鍵
public const byte vbKeyF3 = 0x72;   //F3 鍵
public const byte vbKeyF4 = 0x73;   //F4 鍵
public const byte vbKeyF5 = 0x74;   //F5 鍵
public const byte vbKeyF6 = 0x75;   //F6 鍵
public const byte vbKeyF7 = 0x76;   //F7 鍵
public const byte vbKeyF8 = 0x77;   //F8 鍵
public const byte vbKeyF9 = 0x78;   //F9 鍵
public const byte vbKeyF10 = 0x79;  //F10 鍵
public const byte vbKeyF11 = 0x7A;  //F11 鍵
public const byte vbKeyF12 = 0x7B;  //F12 鍵

#endregion

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章