按住键

时间:2013-04-30 16:43:42

标签: c# winforms

我希望在我的程序运行时按下一个键,所以我这样做了:

public partial class Form1 : Form
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    const int KEY_DOWN_EVENT = 0x0001; //Key down flag
    const int KEY_UP_EVENT = 0x0002; //Key up flag

    byte VK_UP = 0x26;

    public Form1()
    {
        InitializeComponent();

        keybd_event(VK_UP, 0, KEY_DOWN_EVENT, 0);
    }

    void gkh_KeyDown(object sender, KeyEventArgs e)
    {
        Debug.WriteLine(e.KeyCode.ToString()); //it only executes once
    }

但只按一次键。我错过了什么?


无法相信它在C#上是不可能的!!甚至德尔福都可以做到!!


我真正想做的是:

假设我按下'a'键,几秒钟后我按下'b'键。 当我松开键'b'时,我希望'a'继续显示在屏幕上。

3 个答案:

答案 0 :(得分:1)

当您按下键时,KeyDown方法仅触发一次。如果我是你,我会让它看起来像

void gkh_KeyDown(object sender, KeyEventArgs e)
{
    //represent that the key is down
    KeysDown[e.KeyCode] = true; // you may represent that the key is down however you want
}

然后创建一个KeyUp事件

void gkh_KeyUp(object sender, KeyEventArgs e)
{
    //represent that the key is not down
    KeysDown[e.KeyCode] = false; // you may represent that the key is down however you want
    Debug.WriteLine(e.KeyCode.ToString()); //it only executes once
}

然后,我会有某种周期性事件

void PeriodicEvent(object sender, KeyEventArgs e)
{
     // if the key is down, write the key.
     if (KeysDown[e.KeyCode])
         Debug.WriteLine(e.KeyCode.ToString());
}

答案 1 :(得分:1)

我认为你希望键盘自动重复。然而,这是键盘控制器的功能,键盘内置于键盘中。 Windows无法执行任何操作,它只能告诉键盘控制器所需的延迟和重复率,如控制面板+键盘小程序中所配置。

所以你的keybd_event()永远不会产生多次击键。您可以使用计时器修复它。

答案 2 :(得分:0)

密钥在技术上仍处于关闭状态,您只能在表单中看到一个事件,如其他人已经解释的那样。

您可以使用GetKeyState()API检查所需密钥的状态来验证这一点。使用@ parsely72 here

发布的示例