2

KeyDownでそれをどのように判断できますか⇧</kbd> + Tab was pressed.

private void DateTimePicker_BirthDate_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Tab && e.Modifiers == Keys.Shift)
   {
       //do stuff
   }
}

両方のキーがまったく同じ秒に押されることはないため、機能しません。あなたは常に最初にシフトし、次に他のシフトを行います..

4

6 に答える 6

8

両方のキーが同じ秒に正確に押されることはないため、機能しません。

あなたのコードが機能しないのは正しいですが、あなたの理由は間違っています。問題は、Tabキーに特別な意味があることです。これにより、フォーカスが変更されます。イベント ハンドラが呼び出されません。

の代わりに別のキーを使用するとTab、コードは正常に機能します。


特定のコントロールの+の動作を本当に変更したい場合は、オーバーライドすることで実行できますが、多くのユーザーがこのキーを使用してフォーム内を移動し、このキーの動作を変更するとそれらのユーザーを困らせる可能性があることに注意してください。ShiftTabProcessCmdKeyTab

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (DateTimePicker_BirthDate.Focused && keyData == (Keys.Tab | Keys.Shift))
    {
        MessageBox.Show("shift + tab pressed");
        return true;
    }
    else
    {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
于 2012-06-22T06:12:13.823 に答える
2

Ctrl K + D のようなキーの組み合わせ (Tab、次に Shift) を探している場合は、MSDN socialから取得したこの変更された例を使用する必要があります。

private StringBuilder _pressedKeys = new StringBuilder();

private void DateTimePicker_BirthDate_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Tab)
    {
        _pressedKeys.Append("Tab");
        return;
    }

    if (e.Modifiers == Keys.Shift)
    {
        _pressedKeys.Append("Shift");
        return;
    }

    if (_pressedKeys.ToString()."TabShift")
    {
        MessageBox.Show("It works!");
         _pressedKeys.Clear();
    }
    else
    {
         _pressedKeys.Clear();
    }

    base.OnKeyDown(e);
}
于 2012-06-22T06:17:51.537 に答える
0

最初に Tab キー押下イベントをフックし、イベント中に Shift キーの状態を確認します。2 つのシフト キーがあることに注意してください。必ず両方にチェックを入れてください。

この非常に関連する投稿は、修飾キーの状態を確認する方法を示しています。

現在押されているキーを検出する方法は?

編集:正当に賛成票を投じるに値する別の回答者によって提供された洞察は、タブキーのデフォルトの動作(コントロールフォーカスを変更するため)を抑制しなければならないということです。

于 2012-06-22T06:12:20.110 に答える
0

この投稿で答えを見つけることができます

于 2012-06-22T06:17:13.933 に答える