DOBON.NET DOBON.NETプログラミング掲示板過去ログ

keyEventでShift+Tabの受け方を教えて下さい

環境/言語:[環境(Windows 2000) 使用言語 (VB.NET)]
分類:[.NET]

お世話になります。

keyEventでShift+Tabの受け方を教えて下さい

e.KeyCode = Keys.Tab And e.KeyCode = Keys.Shift
でしょうか?

e.KeyCode = Keys.Tab + e.KeyCode = Keys.Shift
でしょうか?

e.KeyCode = Keys.Tab + e.Shift = True
でしょうか?

e.KeyCode = Keys.Tab + e.KeyCode = Keys.Shift = True
でしょうか?

それとも全然違うのでしょうか?
宜しくお願い致します。
■No7640に返信(もんさんの記事)

> keyEventでShift+Tabの受け方を教えて下さい

まず、「keyEvent」といっても、複数該当します。
とはいえ、

> e.KeyCode = Keys.Tab And e.KeyCode = Keys.Shift
> でしょうか?
> e.KeyCode = Keys.Tab + e.KeyCode = Keys.Shift
> でしょうか?
> e.KeyCode = Keys.Tab + e.Shift = True
> でしょうか?
> e.KeyCode = Keys.Tab + e.KeyCode = Keys.Shift = True
> でしょうか?

から察するに、KeyDownイベントだと仮定させて頂きます。

> それとも全然違うのでしょうか?
> 宜しくお願い致します。

まず Shift の押下を確認するために、
「e.Shift = True」であることを確認します。
その後に、「e.KeyCode = Keys.Tab」という条件を加えれば問題ありません。

If e.Shift = True Then
  If e.KeyCode = Keys.Tab Then
    '/ TODO:ここに処理を追加
  End If
End If

# ただ、通常 TextBox では [Tab]キーによる KeyDown イベントは発生しないハズですが、
# その辺りは、質問内容から察するに説明不要のようですね。


蛇足ですが、

> e.KeyCode = Keys.Tab And e.KeyCode = Keys.Shift

このようなイメージで、System.Windows.Forms.Keys を表す時は、

 keyData = Keys.Tab Or Keys.Shift

のようになります。
これは C で単一の引数に複数のキーワードを指定する時と同じですね。
ご回答有難う御座いました。m(_ _)m

コマンドボタンをオーバーライドしTabキーを認識させています。

KeyDownEventでShift+Tabを認識させたいです

If e.Shift = True Then
  If e.KeyCode = Keys.Tab Then
    '/ TODO:ここに処理を追加
    ここに隣のボタンにFocusを遷移させたいのですが
  End If
End If

この記述では上手く行きません
Tabは認識しています。
Shiftも認識しています。

上記のIfで e.Shift = True は認識し
次の

If e.KeyCode = Keys.Tab Thenまで

行くのですが、その中まで入りません。
何故でしょうか?
■No7642に返信(もんさんの記事)
> ご回答有難う御座いました。m(_ _)m
>
> コマンドボタンをオーバーライドしTabキーを認識させています。
>
> KeyDownEventでShift+Tabを認識させたいです
>
> If e.Shift = True Then
>   If e.KeyCode = Keys.Tab Then
>     '/ TODO:ここに処理を追加
>     ここに隣のボタンにFocusを遷移させたいのですが
>   End If
> End If
>
> この記述では上手く行きません
> Tabは認識しています。
> Shiftも認識しています。
>
> 上記のIfで e.Shift = True は認識し
> 次の
>
> If e.KeyCode = Keys.Tab Thenまで
>
> 行くのですが、その中まで入りません。
> 何故でしょうか?

こんにちわ。

デバック実行されているのでしょうか?
If e.KeyCode = Keys.Tab Thenの中でメッセージを出すとかしてみるのはどうでしょう。
ご返事有難う御座いました。。

MsgBoxを出す様にしましたが、出ません。
■No7646に返信(もんさんの記事)

仰ってる事実が、イマイチわかりません。

> If e.KeyCode = Keys.Tab Thenまで
> 行くのですが、その中まで入りません。

ホントに、e.KeyCode は Keys.Tab でしょうか?
変数ウォッチなどで確認してください。
とはいえ、

> Tabは認識しています。
> Shiftも認識しています。

とか明記してますし・・・ でも、そうなると・・・

If e.Shift = True Then
  If e.KeyCode = Keys.Tab Then
    MessageBox.Show("ココに処理を追加")
  End If
End If

普通に考えて、条件満たしていれば表示されるハズですけどねぇ・・・

# おっしゃっていることをすべて信じると矛盾が生じるのは何故でしょう。
ご返信有難う御座いました。

ソースをそのままコピーして貼り付けます。


    If e.Shift = True Then
If e.KeyCode = Keys.Tab Then
MessageBox.Show("出た")
btnUpdate.Focus() '登録ボタンFocus
End If
End If


何処かおかしいでしょうか?

このKeyDownEventの上に普通のTab押下の処理は
通ります。

If e.Shift = True Thenのイフ文も入りますので
どちらも認識していると思います。
もんさん、こんにちは。

こうなのでは?
If e.Shift = True And e.KeyCode = Keys.Tab Then
  MessageBox.Show("出た")
End If
■No7651に返信(ぺがらぼさんの記事)
> もんさん、こんにちは。
>
> こうなのでは?
> If e.Shift = True And e.KeyCode = Keys.Tab Then
>   MessageBox.Show("出た")
> End If

同じことだと思いますが、
1行にまとめるなら、AndAlso を使うべきような・・・

# でも、If のネストとAndAlsoは同じ動きをするハズ・・・
java.lang.Nullpoさん、こんにちは。
揚げ足を取るみたいで申し訳無いのですが...
>>こうなのでは?
>>If e.Shift = True And e.KeyCode = Keys.Tab Then
>>  MessageBox.Show("出た")
>>End If
>
> 同じことだと思いますが、
えっと、デバッグをしていただくと、解るのですが、
Shiftキーを押した時点でイベントが発生するので、
If e.KeyCode = Keys.Tab Then
のところで、キーコード検出内容はShiftKeyになってしまうのです。
それを防ぐ為には、Shiftキーをスルーする必要があります。
で、改めて、Tabキーのキーコード検出時に両方のキーコードが格納されるようにする必要があるのです。

> 1行にまとめるなら、AndAlso を使うべきような・・・
> # でも、If のネストとAndAlsoは同じ動きをするハズ・・・
これについては、個人的な好みもあるので...
■No7654に返信(ぺがらぼさんの記事)
> java.lang.Nullpoさん、こんにちは。
> 揚げ足を取るみたいで申し訳無いのですが...

そーゆーことでしたか。
デバッガでインラインでやれば、ブレイク位置が判定前だと受け付けが単一キーになりますね。
ブレイクしないで実行しなければ表示されますが(確認済み)

自分で確認取ってるだけに、同じ状況だと決め付けていたようですね。
■No7655に返信(java.lang.Nullpoさんの記事)
> ■No7654に返信(ぺがらぼさんの記事)
>>java.lang.Nullpoさん、こんにちは。
>>揚げ足を取るみたいで申し訳無いのですが...
>
> そーゆーことでしたか。
> デバッガでインラインでやれば、ブレイク位置が判定前だと受け付けが単一キーになりますね。
> ブレイクしないで実行しなければ表示されますが(確認済み)
>
> 自分で確認取ってるだけに、同じ状況だと決め付けていたようですね。

ごめんなさい。私の説明に誤りがありました。
java.lang.Nullpoさんのコーディングは問題ないです。
ただ、デバッガを使用すると期待した結果にならない事は確かです。
ぺがさん、フォロー感謝します。

■No7656に返信(ぺがらぼさんの記事)
> ごめんなさい。私の説明に誤りがありました。
> java.lang.Nullpoさんのコーディングは問題ないです。
> ただ、デバッガを使用すると期待した結果にならない事は確かです。

はい、[↓]はそういう意味です。

> > ブレイク位置が判定前だと受け付けが単一キーになりますね。

とはいえ、私も指示がまずかったですね...。
お手数かけましたm(_ _)m > ぺがさん

/* --------------------------------------------------------------- */

今回、KeyDown イベントの KeyEventArgs でのお話でしたので、
KeyCode メンバと Shift メンバ で表現すべきかと思ったのですが、

 If e.KeyData = (Keys.Tab Or Keys.Shift) Then

という表現もあります。

# とはいえ、色んな情報を出しても混乱しますね。
様々なご伝授有難う御座いました。

色々解析したところ、ボタンコントロールをオーバーライドしているクラスで
Key制限をかけていました。

単一のKeyEventは認識するのですが、Shift+Tabキーの認識をしていませんでした

デバックしていても単一しか確認出来ない為、認識していたものと勘違いしていました。
本当に申し訳御座いませんでした。

未だ初心者ですので、許してください。
本当に皆さま、有難う御座いました。
又色々相談させて下さい。
宜しくお願い致します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板