如何将字符转换为键码?

15

我该如何将反斜杠键('\')转换为键码?

在我的键盘上,反斜杠的代码是220,但以下方法无法正常工作:

(int)'\\'

返回92。

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

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

有什么想法吗?


你看过这个答案吗?https://dev59.com/Y3RC5IYBdhLWcg3wXP0C - jcolebrand
是的,我需要将char转换为int。而且我需要一个跨平台的解决方案。不涉及WM_Messages... - Murat from Daminion Software
我似乎认为在键盘混淆方面没有所谓的“跨平台”。考虑到Mac键盘上没有Windows键,Windows键盘上没有Command键,Linux也没有。这三个系统都能够识别其他键,但是映射并不一致。或者你在应用程序中忽略了修饰键吗?那可能会带来其他困难。然而,像往常一样,我的理解可能是错误的。你的体验可能会有所不同。祝好! - jcolebrand
你是否成功解决了这个问题?你还需要帮助吗? - jcolebrand
4个回答

23

您可以使用P / Invoke 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)才能生成打字键的键盘布局。这种代码最好避免使用。


适用于我,美国键盘,Windows 10,C# Windows.Forms 应用程序。 - gridtrak

1

如果

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

那么

public static int ToKeyValue(this char ch)
{
    return (int)(System.Windows.Forms.Keys)ch;
}

我曾经认为OemPipe应该是|,而OemBackslash应该是\\ - Powerlord
@R. Bemrose:是的,确实如此。但是当我在键盘上按 ''(位于退格键下方和回车键上方)时,我的测试文本框会触发 KeyUp 事件,其中 KeyCode = 220,这正是 OP 所寻找的。 - abatishchev

1

或者你可以保持简单,进行投射。

(Keys)keyToConvert

0

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

http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx

请注意,您需要了解键盘,查看您提到的“\”键,这是VK_OEM_5虚拟键,对于美国键盘而言,如果未按Shift,则为“\”,如果按下Shift,则为“|”,因此您的函数还需要知道正在使用的键盘。

当然,如果您想从虚拟键代码映射到字符,则可以使用interop调用MapVirtualKeyEx函数。

更新 根据您的评论,这将给您想要的结果。

[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)'\\')
  {

  }
}

谢谢提供链接。我看到了以下内容:VK_OEM_5: 0xDC: 220 用于杂项字符; 它可能因键盘而异。对于美国标准键盘,'\|' 键 我需要一个与键盘无关的解决方案。最好的解决方案可能是这样的: public void TextBox_KeyDown(object sender, KeyEventArgs e) { if ((String.Parse(e.KeyCode).EndsWith("\\"))... } - Murat from Daminion Software
@Murat,没有String.Parse()函数。我添加了一个示例,应该可以帮助你完成你想要做的事情。 - Chris Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接