VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 キーボード・キー操作関係のメニュー
1.どのキーが押されたかを取得する方法色々
2.特殊キーの状態を取得・タブキーの押下を取得する
3.SendInput 関数を使ってプログラム上からキーボードを操作する
4.アプリ上でのキー操作用に特化した自作 DLL の使用例 
5.SendKeys を使ってキーストロークをアクティブなアプリケーションに送信する
6.
7.
8. 
9. 
10. 
11.
12.
 . 
20.その他、当サイト内に掲載のキーボード・キー操作に関するサンプル


1.どのキーが押されたかを取得する方法色々(12_Key_01) (旧、SampleNo.468)
1.どのキーが押されたかを取得する一般的な方法
2.Shift キー / Ctrl キー / Alt キー が押された事を取得
3.Ctrl キー + Alt キーが押された事を取得
4.Ctr キー + Alt キー + A キー が押された事を取得
5.左右どちらの Shift / Ctrl / Alt キーが押されたかを取得する
6.どちらの Enter キー(標準/テンキー)が押されたかを取得する

上記が全てではありませんし、上記の方法では取得できない特殊キーもあります。
使用目的に合わせて色々試して(どのイベント内で取得するかも含め)見て下さい。(一部期待通りに動作しない悪い例の場合もあります。)
e.Shift / e.Control / e.Alt 等を使って比較される場合は、3つのキーの状態をすべて指定して比較する必要があります。
If e.Control Then のようなコードでは、期待通り(Control キーを単独で押している)の動作をしてくれません。
詳しくは、下記リンク等の MSDN の各解説サイトをご覧ください。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.keyeventargs.keycode.aspx
又、今回は、KeyDown イベントで取得していますが、.NET Framework 2.0 からは PreviewKeyDown イベントが追加されたのでそちらも試して見て下さい。
 下記プログラムコードに関する補足・注意事項 
動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86
Option :[Compare Text] [Explicit On] [Infer On] [Strict On]
Imports :System.Runtime.InteropServices
参照設定:
追加なし
使用コン:TextBox1 〜 TextBox6
トロール:
このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので)
必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい)
このページのトップへ移動します。 1.どのキーが押されたかを取得する一般的な方法

Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
'1.押されたキーを取得
    'e.KeyCode プロパティ :KeyDown イベント又は KeyUp イベントのキーボード コードを取得します。
    'e.KeyData プロパティ :KeyDown イベント又は KeyUp イベントのキーデータを取得します。
    'e.KeyValue プロパティ:KeyDown イベント又は KeyUp イベントのキーボード値を取得します。

    Dim msg As String = String.Format("KeyCode  = {0:}" & vbCrLf & _
                                      "KeyData  = {1:0}" & vbCrLf & _
                                      "KeyValue = {2:0}" _
            , e.KeyCode.ToString, e.KeyData.ToString, e.KeyValue.ToString)
    MessageBox.Show(msg)
    Debug.Print(msg)
End Sub

[a]キーを押した場合の実行結果
KeyCode  = A
KeyData  = A
KeyValue = 65


.NET Framework 2.0 以降では、PreviewKeyDown イベントでも取得できます。

Private
Sub TextBox1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles TextBox1.PreviewKeyDown
'9.PreviewKeyDown イベントでの取得(.NET Framework 2.0 以降で追加)
    'PreviewKeyDown イベント:キーが押された場合、KeyDown イベントの前に発生します。
    'MSDN のPreviewKeyDown イベントの解説の項を読んでおいて下さい。

    Dim msg As String = String.Format("KeyCode  = {0:}" & vbCrLf & _
                                      "KeyData  = {1:0}" & vbCrLf & _
                                      "KeyValue = {2:0}" _
            , e.KeyCode.ToString, e.KeyData.ToString, e.KeyValue.ToString)
    MessageBox.Show(msg)
End Sub

このページのトップへ移動します。 2.Shift キー / Ctrl キー / Alt キー が押された事を取得

Private Sub TextBox2_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox2.KeyDown
'2.Shift キー が押された事を取得
    '(Ctrl キー や Alt キー の場合も同様です。キーコードを変えて試して下さい。)
    '(Shift キー / CTRL + Shift キー / ALT + Shift キー を同時に押した場合も試して下さい。)

    'e.Shift プロパティ:Shift キーが押されたかどうかを示す値を取得します。
    If e.Shift Then
        '(1)× この場合、Shift + CTRL + ALT でも反応します。従ってそれでも問題が無い場合に使用して下さい。
        MessageBox.Show("(1)× If e.Shift Then")
    End If

    If e.Shift = True And e.Control = False And e.Alt = False Then
        '(2)○ この場合は、Shift キー 単独で押され時に反応します。
        MessageBox.Show("(2)○ If (e.Shift = True And e.Control = False And e.Alt = False) Then")
    End If

    If e.KeyCode = Keys.ShiftKey Then
        '(3)× この場合、Shift + CTRL + ALT でも反応します。従ってそれでも問題が無い場合に使用して下さい。
        MessageBox.Show("(3)× If e.KeyCode = Keys.ShiftKey Then")
    End If

    If e.KeyCode = Keys.Shift Then
        '(4)× これでは取得できません。
        MessageBox.Show("(4) If e.KeyCode = Keys.Shift Then")
    End If

    If e.KeyData = (Keys.ShiftKey Or Keys.Shift) Then
        '(5)○ この場合は、Shift キー 単独で押され時に反応します。
        MessageBox.Show("(5)○ If e.KeyData = (Keys.ShiftKey Or Keys.Shift) Then")
    End If

    'e.Modifiers プロパティ:KeyDown イベント又は KeyUp イベントの修飾フラグを取得します。
    'このフラグは、Ctrl キー、Shift キー、および Alt キーのどの組み合わせが押されたのかを示します。
    If e.Modifiers = Keys.Shift Then
        '(6)◎ この場合は、Shift キー 単独で押され時に反応します。
        MessageBox.Show("(6)◎ If e.Modifiers = Keys.Shift Then")
    End If

    If e.KeyValue = 16 Then
        '(7)× この場合、Shift + CTRL + ALT でも反応します。従ってそれでも問題が無い場合に使用して下さい。
        MessageBox.Show("(7)× If e.KeyValue = 16 Then")
    End If
End Sub


どのように反応するかは、ご自分で試して確認して下さい。

このページのトップへ移動します。 3.Ctrl キー + Alt キーが押された事を取得

Private Sub TextBox3_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox3.KeyDown
'3.Ctrl キー + Alt キーが押された事を取得
    '(2.の結果を踏まえて試した分です。)
    If (e.Shift = False And e.Control = True And e.Alt = True) Then
        MessageBox.Show("(1)○ If (e.Shift = False And e.Control = True And e.Alt = True) Then")
    End If

    If e.KeyData = (Keys.Control Or Keys.Alt) Then
        MessageBox.Show("(2)◎ If e.KeyData = (Keys.Control Or Keys.Alt) Then")
    End If

    If e.Modifiers = (Keys.Alt Or Keys.Control) Then
        MessageBox.Show("(3)◎ If e.Modifiers = (Keys.Alt Or Keys.Control) Then")
    End If
End Sub

このページのトップへ移動します。 4.Ctr キー + Alt キー + A キー が押された事を取得

Private Sub TextBox4_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox4.KeyDown
'4.Ctr キー + Alt キー + A キー が押された事を取得
    '(3.の結果を踏まえて試した分です。)
    'これで、Shift + CTRL + ALT + 任意のキー の場合でも理解できるかと思いますので
    'これ以上の組み合わせのテストは省略します。

    If e.KeyCode = Keys.A And (e.Shift = False And e.Control = True And e.Alt = True) Then
        MessageBox.Show("(1)○ If e.KeyCode = Keys.A And (e.Shift = False And e.Control = True And e.Alt = True) Then")
    End If

    If e.KeyData = (Keys.Control Or Keys.Alt Or Keys.A) Then
        MessageBox.Show("(2)◎ If e.KeyData = (Keys.Control Or Keys.Alt Or Keys.A) Then")
    End If

    If e.KeyCode = Keys.A AndAlso e.Modifiers = (Keys.Alt Or Keys.Control) Then
        MessageBox.Show("(3)○ If e.KeyCode = Keys.A AndAlso e.Modifiers = (Keys.Alt Or Keys.Control) Then")
    End If
End Sub

このページのトップへ移動します。 5.左右どちらの Shift / Ctrl / Alt キーが押されたかを取得する

Private Sub TextBox5_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox5.KeyDown
'5.左右どちらの Shift / Ctrl / Alt キーが押されたかを取得する。
    'VB2010 らしい簡単な方法があるのかなと思って調べて見たのですが見当たらないので。
    If GetKeyState(Keys.LShiftKey) < 0 Then
        MessageBox.Show("左の Shift キーが押されました。")
    ElseIf GetKeyState(Keys.RShiftKey) < 0 Then
        MessageBox.Show("右の Shift キーが押されました。")
    End If

    If GetKeyState(Keys.LControlKey) < 0 Then
        MessageBox.Show("左の Control キーが押されました。")
    ElseIf GetKeyState(Keys.RControlKey) < 0 Then
        MessageBox.Show("右の Control キーが押されました。")
    End If

    If GetKeyState(Keys.LMenu) < 0 Then
        MessageBox.Show("左の Alt キーが押されました。")
    ElseIf GetKeyState(Keys.RMenu) < 0 Then
        MessageBox.Show("右の Alt キーが押されました。")
    End If
End Sub


''' <summary>
''' 仮想キーの押下状態を取得する(1064)
''' </summary>
''' <param name="nVirtKey">仮想キーコードを指定します</param>
''' <returns>指定された仮想キーの状態を表し、
'''          最上位ビットが 1 のときはキーが押されていることを、0 のときは
'''     キーが押されていないことを示します</returns>
''' <remarks></remarks>
<DllImport("User32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function GetKeyState( _
    ByVal nVirtKey As Integer) As Integer
End Function

このページのトップへ移動します。 6.どちらの Enter キー(標準/テンキー)が押されたかを取得する

Private Sub TextBox6_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox6.KeyDown
'6.どちらの Enter キー(標準/テンキー)が押されたかを取得
    'VB2010 らしい簡単な方法があるのかなと思って調べて見たのですが見当たらないので。

    Dim nMsg As MSG
    Dim pm As Boolean
    'メッセージを取得(あれば1が返る)
    pm = PeekMessage(nMsg, Me.Handle, 0, 0, PM_NOREMOVE)
    If pm <> False And nMsg.wParam = Keys.Return Then
        'lParam の 24 ビットめをチェックします。キーが拡張キーならば
        'ビット 24 は 1 になり、そうでなければ 0 が返ります。
        If CBool(nMsg.lParam And &H1000000) Then
            MsgBox("テンキー側の ENTER キーが押されました")
        Else
            MsgBox("標準キーボード側の ENTER キーが押されました")
        End If
    End If
End Sub


'PeekMessage 関数がメッセージを処理した後、そのメッセージをキューから削除しません。
Private Const PM_NOREMOVE As Integer = &H0

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Structure POINTAPI
    Public x As Integer        'x座標
    Public y As Integer        'y座標
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Structure MSG
    Public hwnd As IntPtr      'ウィンドウハンドル
    Public message As Integer  'メッセージID
    Public wParam As Integer   'WParamフィールド(メッセージID毎に異なる)
    Public lParam As Integer   'LParamフィールド(メッセージID毎に異なる)
    Public time As Integer     '時間
    Public pt As POINTAPI      'カーソル位置(スクリーン座標)
End Structure

''' <summary>
''' 呼び出し側スレッドのメッセージキューから、メッセージを取得します。
''' </summary>
''' <param name="lpMsg">MSG構造体へのポインターを指定します</param>
''' <param name="hwnd">メッセージを取得するウィンドウのハンドルを指定します。</param>
''' <param name="wMsgFilterMin">取得するメッセージの範囲の最小値を指定します。</param>
''' <param name="wMsgFilterMax">取得するメッセージの範囲の最大値を指定します。</param>
''' <param name="wRemoveMsg">取得したメッセージを、メッセージキューから削除するかを定数で指定します。</param>
''' <returns>メッセージを取得したときは、TRUE が返ります。</returns>
''' <remarks></remarks>
<DllImport("User32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function PeekMessage( _
    ByRef lpMsg As MSG, _
    ByVal hwnd As IntPtr, _
    ByVal wMsgFilterMin As Integer, _
    ByVal wMsgFilterMax As Integer, _
    ByVal wRemoveMsg As Integer) As Boolean
End Function

このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
キー認識,キーイベント,キーコード,KeyData,KeyCode ,押された,テンキー




このページのトップへ移動します。