- PR -

[Ctrl]キーを押下しながらボタンクリック時の判定

投稿者投稿内容
なんとか
会議室デビュー日: 2006/09/27
投稿数: 17
投稿日時: 2007-06-11 11:48
お世話になります。

vb.netでWindowaフォームを作成しています。
そこでボタン[A]をクリックした時の処理と、
[Ctrl]キーを押下しながらボタン[A]をクリックした時とで処理を分けたいと思っています。
「[Ctrl]キーを押下しながら」という判定ができません。

どなたか御教授お願いします。
オノデラ
会議室デビュー日: 2007/06/05
投稿数: 10
投稿日時: 2007-06-11 12:40
おそらく「KeyDown」イベントを使ってキーの押下状態を取得していると思うのですが、そうであれば「KeyEventArgs e」引数から「e.Control」で取得することができます。

こんな感じ。

コード:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A && e.Control)
    {
        this.Text = "Ctrl + A";
    }
    else if (e.KeyCode == Keys.A)
    {
        this.Text = "A";
    }
    else
    {
        this.Text = "none";
    }
}

オノデラ
会議室デビュー日: 2007/06/05
投稿数: 10
投稿日時: 2007-06-11 12:43
ごめんなさい。VB.net でしたね(^^;

コード:
Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
    Handles MyBase.KeyDown

    If e.KeyCode = Keys.A AndAlso e.Control Then
        Me.Text = "Ctrl + A"
    ElseIf e.KeyCode = Keys.A Then
        Me.Text = "A"
    Else
        Me.Text = "none"
    End If

End Sub

IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-06-11 13:26
もしVB2005なら
コード:
	Private Sub ButtonA_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonA.Click
		If My.Computer.Keyboard.CtrlKeyDown Then
			MsgBox("CTRL key down")
		Else
			MsgBox("CTRL key up")
		End If
	End Sub


てな感じでいかがでしょうか。
なんとか
会議室デビュー日: 2006/09/27
投稿数: 17
投稿日時: 2007-06-11 13:36
オノデラさん
返信ありがとうございます。

教えて頂いた方法は既に試していたのですが、キーイベントは取得できませんでした。
再度試してみましたが、やはり結果は同じでした。
(キーを押しても「Form1_KeyDown」に入ってこない)
テキストボックス等では問題なく取得できるのですが・・・

コード間違い等を避ける為、教えて頂いたコードをコピーしてもダメでした。
また、うまくいった場合はグローバルなフラグを用意してKeyDownでOn、KeyUpでOffといった形になるのでしょうか?

なんとか
会議室デビュー日: 2006/09/27
投稿数: 17
投稿日時: 2007-06-11 13:39
IIJIMASさん
返信ありがとうございます。

VB2005を使用しています。
教えて頂いた方法試してみました。
期待通りの動作となりました。

ありがとうございました。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-11 15:10
もう解決したみたいですが、.NET Framework 1.x (2002 && 2003), .NET Framework 2.0 (2005) 問わず、以下の方法でできます。

コード:

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 
        If (System.Windows.Forms.Control.ModifierKeys And Keys.Shift) = Keys.Shift Then
            MessageBox.Show("Shift キーを押しながら Button1 をクリックしやがったな")
        Else
            MessageBox.Show("Button1 をクリックしやがったな")
        End If
    End Sub


ちなみにオノデラさんの方法は KeyDown イベントでのお話ですので、Click 時にどうこうできません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なんとか
会議室デビュー日: 2006/09/27
投稿数: 17
投稿日時: 2007-06-11 15:26
じゃんぬねっとさん
返信ありがとうございます。

教えて頂いた方法でも実現できました。
ちなみに
If (System.Windows.Forms.Control.ModifierKeys And Keys.Shift) = Keys.Shift Then
ではなく
If System.Windows.Forms.Control.ModifierKeys = Keys.Shift Then
でも問題ないですか?
(動作的には問題ありませんでした)
「And Keys.Shift」の部分がよく理解できなかったので、変更してみました。

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