- PR -

CTL+TABの拾い方について

投稿者投稿内容
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-06-20 14:50

いつもお世話なっております。
現在、VB.net2003にてWindowsアプリケーションの開発を行っております。

さっそく、質問なのですが、キーボードにて
CTL+TABが押されたときに処理したい内容があるのですが、
CTL+TABの拾い方がわからなくて困っています・・・。

CTLだけなら、Keydown、Tabだけなら、ProcessDialogKeyをオーバーライドして
取得できますが、組み合わさった時の取得方法がわからないのです・・・。

どうか、知恵をお借りできないでしょうか??
どうか、よろしくお願いいたします。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-20 15:01
引用:

.netさんの書き込み (2006-06-20 14:50) より:

CTLだけなら、Keydown、Tabだけなら、ProcessDialogKeyをオーバーライドして
取得できますが、組み合わさった時の取得方法がわからないのです・・・。


KeyUpイベントで拾えます。

以下のコードでどうでしょう?
コード:

private void Form1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
if ((e.Control == true) && (e.KeyCode == Keys.Tab))
{
したい処理
}
}



[追加]
#すいません。押されたときの処理でしたか・・・

[ メッセージ編集済み 編集者: 深山 編集日時 2006-06-20 15:04 ]
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-20 15:02
KeyDownイベントでは第二引数がKeyEventArgsになるはずなので、
If e.Control AndAlso e.KeyCode = Keys.Tab Then
で判定できると思います。

あっ、被った(^^;

KeyUpの方がいいのかな?
Ctrlを押しながらTabを押し、先にCtrlを離してからTabを離した場合どう動いた方がいいかによるのかな?

[ メッセージ編集済み 編集者: ぼのぼの 編集日時 2006-06-20 15:04 ]
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-06-20 15:44
ぼのぼの様、深山様
さっそくのご返信ありがとうございます。

>ぼのぼの様
>If e.Control AndAlso e.KeyCode = Keys.Tab Then
なぜか、テキストボックスでは上記IF文に入ってくれません???
リストボックス、コンボボックス等だと入るのですが・・・。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-20 15:59
引用:

.netさんの書き込み (2006-06-20 15:44) より:
ぼのぼの様、深山様
さっそくのご返信ありがとうございます。

>ぼのぼの様
>If e.Control AndAlso e.KeyCode = Keys.Tab Then
なぜか、テキストボックスでは上記IF文に入ってくれません???
リストボックス、コンボボックス等だと入るのですが・・・。



テキストボックスでのtabキーEnterキーの扱いについてが参考になると思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-20 16:17
引用:

.netさんの書き込み (2006-06-20 14:50) より:

CTLだけなら、Keydown、Tabだけなら、ProcessDialogKeyをオーバーライドして
取得できますが、組み合わさった時の取得方法がわからないのです・・・。


ProcessDialogKey メソッドで、取得すべきかどうかは別として、普通に取得できますけど...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
.net
ベテラン
会議室デビュー日: 2005/04/11
投稿数: 95
投稿日時: 2006-06-20 16:24

皆様、ご返信ありがとうございます。

>じゃんぬねっと様
>ProcessDialogKey メソッドで、取得すべきかどうかは別として、普通に取得できます>けど...

Tabキーに関しては、プリプロセスの関係で普通には取れないような気がするのですが・・・。実際に、取れなかったのですが・・・。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-20 16:52
引用:

.netさんの書き込み (2006-06-20 16:24) より:

Tabキーに関しては、プリプロセスの関係で普通には取れないような気がするのですが・・・。実際に、取れなかったのですが・・・。


私は、こちらと [↓] を見て、'keyData から取得する方法' を、ご存知でないのかと思ったのです。
論理積で取得する方法を存じない == keyData に何が格納されているかを存じない、のかと...
読み違いをしてしまいました、お許しください。(*_ _)

引用:

Tabだけなら、ProcessDialogKeyをオーバーライドして取得できます


先の投稿とは、相反していることを書いているような気がしますが、
それはともかく、クライアント入力領域などでは、[Tab] キーは取得できません。

ProcessDialogKey メソッドで行っている処理を、ProcessCmdKey メソッドに丸っと移植すれば、望みどおり取得はできます...

コード:

    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
        Const WM_KEYDOWN As Integer = &H100

        If msg.Msg = WM_KEYDOWN Then
            If (keyData And Keys.Control) = Keys.Control Then
                If (keyData And Keys.Tab) = Keys.Tab Then
                    MessageBox.Show("[Ctrl] + [Tab] が押されたようですが、何か?")
                End If
            End If
        End If

        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function


ですが、Is~ 関係のメソッドをオーバーライドすべきでしょうね。
リンク先に答えが書いてあるかと思いますので、一度ご参照ください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)