2

私は単純なキーリマッパーを作ろうとしています.1つのキーボードキーが押されたときに、コードによって生成された別のキーが押されます。これが私のコードです:

[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 秒に 1 回しか機能しないことです。この keybd_eventd winapi 関数の何が問題になっていますか? 使い方を間違えたのでしょうか?wndProc の他のもの (id) に問題はなく、keybd_event のみに問題があります。

4

1 に答える 1

4

問題は、間違った関数 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);
}
于 2013-03-23T12:53:12.727 に答える