[英]How do I convert a "Keys" enum value to an "int" character in C#?
這似乎應該很容易,但我很難弄清楚這里需要發生什么。
在“KeyDown”事件處理程序中,如果“e.KeyValue”是一個數字,我想將其視為一個數字並將其存儲為一個 int。 所以,如果我在數字鍵盤上點擊“8”,我不想要“Numpad8”,我想要可以添加或減去的 int 值 8 等等。
那么,如何將 KeyValue 轉換為 int?
我會采用以下解決方案:
int value = -1;
if (e.KeyValue >= ((int) Keys.NumPad0) && e.KeyValue <= ((int) Keys.NumPad9)) { // numpad
value = e.KeyValue - ((int) Keys.NumPad0);
} else if (e.KeyValue >= ((int) Keys.D0) && e.KeyValue <= ((int) Keys.D9)) { // regular numbers
value = e.KeyValue - ((int) Keys.D0);
}
...如果重點是要獲取打入的鍵的標簽的數值。
這樣的事情應該可以正常工作:(已編輯)
int keyVal = (int)e.KeyValue;
int value = -1;
if ((keyVal >= (int)Keys.D0 && keyVal <= (int)Keys.D9)
{
value = (int)e.KeyValue - (int)Keys.D0;
}
else if (keyVal >= (int)Keys.NumPad0 && keyVal <= (int)Keys.NumPad9)
{
value = (int)e.KeyValue - (int)Keys.NumPad0;
}
事實:鍵盤有按鍵。 有些鍵代表數字,有些則不能。
問題(改寫):如果鍵代表數字,則產生由鍵代表的數字值。
為了解決該問題,必須知道哪些鍵(在所有鍵集中)代表數字以及每個(數字)鍵代表的確切數值。
據我所知,沒有一種簡單的方法可以從框架中獲得這種映射。
注意:D0-D9和NumPad0-NamPad9在Keys枚舉中是順序的事實是偶然的,並且沒有理由依賴於這些值的順序排序。
所以解決方案是:
private static readonly IDictionary<Keys, int> NumericKeys =
new Dictionary<Keys, int> {
{ Keys.D0, 0 },
{ Keys.D1, 1 },
{ Keys.D2, 2 },
{ Keys.D3, 3 },
{ Keys.D4, 4 },
{ Keys.D5, 5 },
{ Keys.D6, 6 },
{ Keys.D7, 7 },
{ Keys.D8, 8 },
{ Keys.D9, 9 },
{ Keys.NumPad0, 0 },
{ Keys.NumPad1, 1 },
{ Keys.NumPad2, 2 },
{ Keys.NumPad3, 3 },
{ Keys.NumPad4, 4 },
{ Keys.NumPad5, 5 },
{ Keys.NumPad6, 6 },
{ Keys.NumPad7, 7 },
{ Keys.NumPad8, 8 },
{ Keys.NumPad9, 9 }
};
private int? GetKeyNumericValue(KeyEventArgs e) {
if (NumericKeys.ContainsKey(e.KeyCode)) return NumericKeys[e.KeyCode];
else return null;
}
可以說,這不是最簡單的解決方案,而是對解決方案進行建模的一種方法。
根據要跟蹤的鍵數,最簡單的方法是為您創建一個選擇案例(我猜是C#中的switch語句?),該案例將檢查keydown的值,並根據該值將值分配給一個合適的整數。
如果需要NUMERIC值,則必須創建一個switch(e.KeyCode)
語句並評估鍵並創建自己的int。 沒有簡單的方法可以將“ Keys
轉換為代表Keys
數字的數字值。 您可以獲得的最接近的值可能是ASCII等效值,仍然需要翻譯。
您可以只聽KeyPress
事件嗎? 它將給出實際按下的字符。
此函數將執行您想要的操作:
private int GetKeyValue(int keyValue)
{
if (keyValue >= 48 && keyValue <= 57)
{
return keyValue - 48;
}
else if (keyValue >= 96 && keyValue <= 105)
{
return keyValue - 96;
}
else
{
return -1; // Not a number... do whatever...
}
}
這樣稱呼它:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int num = GetKeyValue(e.KeyValue);
}
我使用了以下兩行簡單代碼:
string key = e.KeyCode.ToString();
if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");
這是獲取可用值的另一種方法:
string key
if (((int)e.Key < 84 && (int)e.Key > 73) || ((int)e.Key < 44 && (int)e.Key > 33))
{
key = ((int)e.Key - 4).ToString();
key = key.Remove(0,1);
}
替代 Carlos Ferreira 發布的內容。
KeyValue表示所按下鍵的字符代碼。 為了獲得其數字值,您應該找到所按下鍵的字符,然后將其從字符解析為整數。
像Convert.ToInt32(e.KeyCode.ToString())之類的東西
或創建一個擴展方法並像調用它一樣
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int num = e.KeyValue.GetKeyValue();
}
擴展方法在哪里
public static class MyExtensions
{
public static int GetKeyValue(this int keyValue)
{
if (keyValue >= 48 && keyValue <= 57)
{
return keyValue - 48;
}
else if (keyValue >= 96 && keyValue <= 105)
{
return keyValue - 96;
}
else
{
return -1; // Not a number... do whatever... }
}
}
}
int i =(int)e.KeyValue;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.