0

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

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”继续显示在屏幕上。

4

3 回答 3

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());
}
于 2013-04-30T16:51:56.420 回答
1

我认为您希望键盘自动重复。然而,这是键盘控制器的功能,键盘内置的芯片。Windows 不做任何事情,它只能告诉键盘控制器所需的延迟和重复率,正如在控制面板 + 键盘小程序中配置的那样。

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

于 2013-04-30T18:45:42.547 回答
0

从技术上讲,关键仍然存在,您只在表单中看到一个事件,正如其他人已经解释的那样。

您可以通过使用 GetKeyState() API 检查所需密钥的状态来验证这一点。在此处使用@parsely72 发布的示例

于 2013-04-30T17:39:45.953 回答