键盘事件只能工作一次

时间:2013-03-21 09:54:11

标签: c# winapi keyboard-events wndproc

我正在尝试制作简单的键重映射 - 当按下一个键盘键时,按代码生成另一个不同的按键。这是我的代码:

[DllImport("user32.dll")]
static extern uint keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
public static void KeyDown(System.Windows.Forms.Keys key)
{
   keybd_event((byte)key, 0, 0, 0);
}
public static void KeyUp(System.Windows.Forms.Keys key)
{
   keybd_event((byte)key, 0, 0x7F, 0);
}
 protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x0312)
            {
                int id = m.WParam.ToInt32();
                ...
                if (id==2) {
                  KeyDown(Keys.Return);
                    KeyUp(Keys.Return);     
                }  
                ...         
            }
            base.WndProc(ref m);
        }

问题是,当我按下分配给id 2的热键时,此按键返回代码每30秒只能运行一次。这个keybd_evend winapi功能怎么了?我用错了吗? wndProc中的其他东西(ids)没有任何问题,只有keybd_event的麻烦。

1 个答案:

答案 0 :(得分:3)

Poblem的功能错误KeyUp和KeyDown。 这是正确的功能:

[DllImport("user32.dll")]
static extern uint keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
public static void KeyDown(System.Windows.Forms.Keys key)
{
      keybd_event((byte)key, 0x45, 0x0001 | 0, 0);
}

public static void KeyUp(System.Windows.Forms.Keys key)
{
      keybd_event((byte)key, 0x45, 0x0001 | 0x0002, 0);
}