Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将字符转换为键代码?_C#_.net - Fatal编程技术网

C# 如何将字符转换为键代码?

C# 如何将字符转换为键代码?,c#,.net,C#,.net,如何将反斜杠键(“\”)转换为键代码 在我的键盘上,反斜杠代码是220,但方法如下 (int)'\\' 返回我92 我需要一些通用转换,比如 int ConvertCharToKeyValue(char c) { // some code here... } 有什么想法吗?据我所知,没有一个函数可以将字符映射到虚拟密钥代码。但是,您可以使用下表开始构建这样的映射 请注意,您需要了解键盘,查看您提到的键“\”,这是VK_OEM_5虚拟键,对于我们键盘来说,如果未移位,则为“\

如何将反斜杠键(“\”)转换为键代码

在我的键盘上,反斜杠代码是220,但方法如下

(int)'\\'
返回我92

我需要一些通用转换,比如

 int ConvertCharToKeyValue(char c)
 {
     // some code here...
 }

有什么想法吗?

据我所知,没有一个函数可以将字符映射到虚拟密钥代码。但是,您可以使用下表开始构建这样的映射

请注意,您需要了解键盘,查看您提到的键“\”,这是VK_OEM_5虚拟键,对于我们键盘来说,如果未移位,则为“\”,如果移位,则为“|”,因此您的功能还需要了解正在使用的键盘

当然,如果您想从虚拟键代码映射到一个字符,您可以使用它来调用函数

更新根据您的评论,这会给您想要的

[DllImport("user32.dll")]
static extern int MapVirtualKey(int uCode, uint uMapType);

const uint MAPVK_VK_TO_CHAR = 0x02;

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
  int key = MapVirtualKey((int)e.KeyCode, MAPVK_VK_TO_CHAR);
  if (key == (int)'\\')
  {

  }
}
您可以p/调用VkKeyScan()将键入键代码转换回虚拟键。请注意,修改器键状态很重要,获取“|”需要按住键盘布局上的shift键。你的函数签名不允许这样,所以我只是编了一些东西:

public static Keys ConvertCharToVirtualKey(char ch) {
    short vkey = VkKeyScan(ch);
    Keys retval = (Keys)(vkey & 0xff);
    int modifiers = vkey >> 8;

    if ((modifiers & 1) != 0) retval |= Keys.Shift;
    if ((modifiers & 2) != 0) retval |= Keys.Control;
    if ((modifiers & 4) != 0) retval |= Keys.Alt;

    return retval;
}

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern short VkKeyScan(char ch);
还要注意需要使用死键(Alt+Gr)生成键入键的键盘布局。最好避免这种代码。

如果

var char = System.Windows.Forms.Keys.OemPipe; // 220
var code = (int)char;
然后


或者,你可以保持它的简单性并将其转换

(Keys)keyToConvert

谢谢你的链接。我读到:VK_OEM_5:0xDC:220用于杂项字符;它可以根据键盘的不同而变化。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~对于美国标准键盘,“\\”键我需要独立于键盘的解决方案。最好的解决方案可能是:public void TextBox\u KeyDown(object sender,KeyEventArgs e){if((String.Parse(e.KeyCode).EndsWith(\\))。}@Murat,没有String.Parse()函数。我添加了一个示例,它应该可以帮助您完成您在这里想要做的事情。我的印象是,
OemPipe
将是
,而
OemBackslash
将是`\`@R。贝姆罗斯:是的。但是当我在键盘上按“\”时(在Backspace下方,在Enter上方)我的测试文本框触发
KeyUp
事件,其中
KeyCode=220
哪个OP在寻找这个答案?是的。我需要从char转换为int。我需要一个独立于平台的解决方案。如果没有WM_消息……我似乎相信不存在这样的“独立于平台的”因为键盘键盘没有Windows键,Windows键盘没有一个命令键。Linux本身也没有。所有三个都能识别其他键,但是映射不一致。或者你忽略了应用程序中的修饰符吗?这可能会带来其他困难。s、 我的理解可能是错误的。YMMV.HTTH。你曾经成功地解决过这个问题吗?你还需要帮助吗?
(Keys)keyToConvert