查看用户是否按了一个键?

时间:2013-01-11 05:10:48

标签: c# winapi

我想查看用户是否按下键盘键。 我尝试了一些代码:

    [DllImport("User32.dll")]
    private static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey);
    [DllImport("User32.dll")]
    private static extern short GetAsyncKeyState(System.Int32 vKey);
    .....
     if ((GetAsyncKeyState(Keys.F10) == -32767))
       {....}

它的作用是只检查按下F10键。它不关心它是Shift + F10还是Ctrl + F10或F10。 但我想要的是单独查看它们是否是Shift + F10然后告诉我用户按下Shift + F10,如果它是F10然后告诉我用户按下了F10。 我怎样才能以简单的方式到达那里?

3 个答案:

答案 0 :(得分:0)

你不能检查如下?

//in pseudocode
if (f10pressed) {
    if (shiftpressed) {
        //Shift+F10
    } else if (ctrlpressed) {
        //Ctrl+F10
    } else {
        //F10
    }
}

答案 1 :(得分:0)

没有一种简单的方法; GetAsyncKeyState()将返回您指定的确切键的值,忽略修饰键的概念。处理WM_CHAR会处理你想要的一些修饰符,但是对于所有这些修饰符(shift,alt,ctrl)你必须明确地检查其他键。

答案 2 :(得分:0)

您需要检查GetAsyncKeyState您感兴趣的每个键。在这种情况下,您将检查F10,然后检查shift,ctrl,alt等。有关可能的值,请参阅virtual key codes,并参阅GetAsyncKeyState

short key = GetAsyncKeyState(Keys.F10);
// Check the most significant bit to see if the key is down
if ( ( key & 0x8000 ) > 0 )
{
     // Check  shift is down 0x10 is value for VK_SHIFT
     key = GetAsyncKeyState( 0x10 );
     if ( key & 0x8000 ) > 0 )
     {
         // Shift key is down as well
     }
     // Repeat for other key states.
}

查看c#keys enumeration,有许多可能的移位值,您可能需要进行一些实验。