日期:2014-05-17  浏览次数:20977 次

请问ABCDEF等键同时按,这样的功能不能实现,Keydown的e.KeyCode好像只能捕到一个键,另外,会不会有多键冲突的问题
请问ABCDEF等键同时按,这样的功能不能实现,
Keydown的e.keycode好像一次只能捕到一个键,
比如:
    private void Multi_KeyDown(object sender, KeyEventArgs e) {
        if (e.KeyCode == Keys.A)
            MessageBox.Show("A");  //只能监听到一个键被按下.
    }
能不能
同时按下ABCDEF.
请高手看下


另外,会不会有多键冲突的问题

------解决方案--------------------
引用:
http://stackoverflow.com/questions/10484085/get-all-keys-that-are-pressed
这个应该可以解决你的问题


这个页面关键性的代码是这几句:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetKeyboardState(byte [] lpKeyState);

var array = new byte[256];
GetKeyboardState(array);

public static byte GetVirtualKeyCode(Key key) {
  int value = (int)key;
  return (byte)(value & 0xFF);
}
------解决方案--------------------

var code = GetVirtualKeyCode(Key.A);
if ((array[code] & 0x80) != 0) {
  // It's pressed
} else { 
  // It's not pressed
}

仔细读读啊,都已经告诉你了,你需要通过这个来判断,在这里你要判断那个键就按照这个来执行就可以了,如果要判断所有的,那就循环处理吧
------解决方案--------------------
我给你个思路,键盘的按键在按下的瞬间会有时差(跟键长有关系),不可能是你同时按下ABCD时,键盘传出的值就是ABCD 有可能是ACBD ,ADBC等等所以只要判断你要的几个键是否被按下就行,不要特别要求顺序,代码如下:VB.NET写的你可以借鉴下.

Dim strKeys As String'所有被按下的键值
Private Sub Form2_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
        Dim strNowKey As String = e.KeyChar '获取当前被按下的键值
        strKeys = strKeys & strNowKey
End Sub

    Private Sub Form2_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
        MessageBox.Show(strKeys)
        strKeys = Nothing
    End Sub

代码是直接触发窗体KeyPress事件.