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

キーボードの自動リピートを望んでいると思います。ただし、これはキーボード コントローラー (キーボードに組み込まれているチップ) の機能です。Windows は何もしません。コントロール パネル + キーボード アプレットで構成されているように、希望する遅延とリピート レートをキーボード コントローラーに伝えることしかできません。

したがって、keybd_event() が複数のキーストロークを生成することはありません。タイマーで修正できます。

于 2013-04-30T18:45:42.547 に答える
1

KeyDownキーを押したときにメソッドが 1 回だけ起動します。もし私があなたなら、私はそれを次のように見せるだろう

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 に答える
0

キーはまだ技術的にダウンしています。他の人がすでに説明したように、フォームにはイベントが 1 つしか表示されません。

これは、GetKeyState() API を使用して目的のキーの状態を確認することで確認できます。ここで@parsely72 によって投稿された例を使用してください

于 2013-04-30T17:39:45.953 に答える