2

これは重複ではありません。多くの同様のスレッドでは、修飾キーを含む組み合わせのキャプチャについて説明しています。

Insert+Tabコントロールからショートカットキー(の組み合わせ)が押されたときに何かをトリガーする必要がありますButton

キャッチ

  1. これには、 .NETにチェック機能が組み込まれているようAltな修飾キーは含まれません。Shift

  2. これはTab、それほど簡単に捕まえられない鍵を持っています。

私が試し、近づいたこと:

1)KeyDownイベントですが、タブをキャプチャしません。

[DllImport("user32.dll")]
public static extern int GetKeyboardState(byte[] keystate);
static void form_KeyDown(object sender, KeyEventArgs e)
{
    if (!(((Form)sender).ActiveControl is Button))
        return;

    byte[] keys = new byte[255];

    GetKeyboardState(keys);

    if (keys[(int)Keys.Insert] == 129 && keys[(int)Keys.Tab] == 129)
    { 
        // doesn't work
    }
    if (keys[(int)Keys.Insert] == 129 && keys[(int)Keys.J] == 129)
    { 
        // works, since here this doesnt involve Tab
    }
}

これは通常の組み合わせで機能し、と一緒に起動しませんTab

2) キーをキャプチャするKeyPreviewイベントTabですが、キーの組み合わせを押す方法がわかりません

static void form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
   if (!(((Form)sender).ActiveControl is Button))
        return;

   if (e.KeyCode == Keys.Tab)
      //works

   if (e.KeyCode == Keys.Insert && e.KeyCode == Keys.Tab)
      //doesn't hit.
}

要件:

1)フォームクラスからイベントを登録していません。代わりに、必要なすべてのイベントを(他のショートカットとともに)作成するユーティリティクラスがあります。formのインスタンスを静的関数に渡すだけです。そのため、さまざまなキーオーバーライド呼び出しをどのように利用する必要があるのか​​よくわかりません。これが私がそれをする方法です:

public frmLogin()
{
    InitializeComponent();
    Utility.SetFormEvents(this);
}

static void SetFormEvents(Form f){
    //foreach control...........
}

しかし、私はこれをあきらめることができます。

ありがとう..

4

1 に答える 1

1

タブはコマンドキーと見なされ、直接押されたことが実際に通知されることはありません。GetKeyStateメソッドをPInvokeすることもできますが、タブがコマンドキー(およびオーバーライドProcessCmdKey)であることを認識し、Insertキーが上か下かを追跡する方が簡単だと思います。例えば:

static bool insertPressed;
static bool tabPressed;

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if(keyData == Keys.Tab)
    {
        tabPressed = true;
        CheckForTabAndInsert();

    }
    return base.ProcessCmdKey(ref msg, keyData);
}

static void form_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Insert)
    {
        insertPressed = true;
        CheckForTabAndInsert();
        insertPressed = false;
    }
}

static void form_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Insert) insertPressed = false;
}

欠点は、ProcessCmdKeyを使用したタブのKeyPressしか取得できないため、実際にサポートできるのはInsert + Tab(Tab + Insertではない)のみであるということです。これは、Tabを使用してコンテキストをあるコントロールから別のコントロールに切り替えるためです。状況によっては(つまり、テキストボックスのコンテキストで)、AcceptTabプロパティを使用して、KeyUpとKeyDownを使用することもできます...しかし、投稿した内容からは、そうではないようです。

于 2012-08-06T15:52:36.880 に答える