Vb.net 将Keys.keycode转换为Virtualkeycode

Vb.net 将Keys.keycode转换为Virtualkeycode,vb.net,keydown,keycode,Vb.net,Keydown,Keycode,在这个问题上绕圈子。无法发布任何可靠的代码,因为尝试了太多不同的方法。基本上,尝试通过(示例代码)获取击键代码(虚拟键和键): 我需要在Shift、Ctrl、Win+Alt上保持左右区分。我知道这不能用于Keys.KeyCode。如果可能,还希望获得虚拟钥匙码名称(例如“VK_LSHIFT”) 以下是我为实现这一目标而使用的一些代码,但都很混乱-不确定这些代码是否与试图实现的目标相关: <DllImport("user32.dll", EntryPoint:="VkKeyScanEx",

在这个问题上绕圈子。无法发布任何可靠的代码,因为尝试了太多不同的方法。基本上,尝试通过(示例代码)获取击键代码(虚拟键和键):

我需要在Shift、Ctrl、Win+Alt上保持左右区分。我知道这不能用于Keys.KeyCode。如果可能,还希望获得虚拟钥匙码名称(例如“VK_LSHIFT”)

以下是我为实现这一目标而使用的一些代码,但都很混乱-不确定这些代码是否与试图实现的目标相关:

<DllImport("user32.dll", EntryPoint:="VkKeyScanEx", CharSet:=CharSet.Unicode)>
Friend Shared Function GetKeyCode(
                   ByVal c As Char,
                   Optional ByVal KeyboardLayout As UIntPtr = Nothing
     ) As Short
End Function

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function MapVirtualKey(ByVal uCode As Integer, ByVal nMapType As Integer) As Integer
End Function

Public Shared Function GetLoByte(ByVal value As Short) As Byte
    Return BitConverter.GetBytes(value).First
End Function

 ' and in keys block:

        Dim RawVCode As Integer = GetKeyCode(ChrW(e.KeyCode))
        Dim LowVCode As Integer = GetLoByte(GetKeyCode(ChrW(e.KeyCode)))

        cfdb.echo("Raw Vcode: " & RawVCode)
        cfdb.echo("Low Vcode: " & LowVCode)
        cfdb.echo("MAPVK_VK_TO_VSC>>>>>>" & MapVirtualKey(e.KeyCode, 0))

好友共享函数GetKeyCode(
ByVal c作为Char,
可选的ByVal键盘布局为UIntPtr=Nothing
)短
端函数
_
公共共享函数MapVirtualKey(ByVal uCode为整数,ByVal nMapType为整数)为整数
端函数
公共共享函数GetLoByte(ByVal值简称)为Byte
返回BitConverter.GetBytes(值).First
端函数
'和在键块中:
整数形式的Dim RawVCode=GetKeyCode(ChrW(e.KeyCode))
整数形式的Dim LowVCode=GetLoByte(GetKeyCode(ChrW(e.KeyCode)))
echo(“原始Vcode:&RawVCode”)
echo(“低Vcode:”和低Vcode)
echo(“MAPVK_VK_TO_VSC>>>>>>>”和MapVirtualKey(e.KeyCode,0))

在这个泥潭上,我真的很感激你的帮助

左右换档键之间的虚拟键代码没有区别。它们只有一个不同的扫描代码,即键盘控制器生成的数字。这一怪癖可以追溯到1981年第一台IBM PC的设计。因此,您试图做的是不可能的。也许我对术语/概念感到困惑,但msdn页面会提出其他建议吗?例如,它有:VK_LSHIFT(0xA0)和VK_RSHIFT(0xA1)。我想要的是如何在按键时获取这些值和名称。页面:
<DllImport("user32.dll", EntryPoint:="VkKeyScanEx", CharSet:=CharSet.Unicode)>
Friend Shared Function GetKeyCode(
                   ByVal c As Char,
                   Optional ByVal KeyboardLayout As UIntPtr = Nothing
     ) As Short
End Function

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Shared Function MapVirtualKey(ByVal uCode As Integer, ByVal nMapType As Integer) As Integer
End Function

Public Shared Function GetLoByte(ByVal value As Short) As Byte
    Return BitConverter.GetBytes(value).First
End Function

 ' and in keys block:

        Dim RawVCode As Integer = GetKeyCode(ChrW(e.KeyCode))
        Dim LowVCode As Integer = GetLoByte(GetKeyCode(ChrW(e.KeyCode)))

        cfdb.echo("Raw Vcode: " & RawVCode)
        cfdb.echo("Low Vcode: " & LowVCode)
        cfdb.echo("MAPVK_VK_TO_VSC>>>>>>" & MapVirtualKey(e.KeyCode, 0))