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

リンク元へ戻ります。 キーボード・キー操作関係のメニュー
1.基本的なキー操作色々
2.特殊キーの状態を取得及び設定する
3.Win32 API関数を使ってのEnterキーでの自由自在フォーカス移動
4.SendInput 関数のDLL化による簡単キーボード操作
5.キーストロークをシミュレートする(SendInput関数使用例)
6.
7.スナップショットをファイルに保存及び印刷(SendInput関数使用例)
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.


2.特殊キーの状態を取得及び設定する
1.タブキーが押されたどうかを取得する
2.特殊キーの状態を取得及び設定
 (1) CapsLock キーの状態を取得及び設定する (2) Insert キーの状態を取得及び設定する (3) NumLock キーの状態を取得及び設定する
3. 
4. 
5. 
6. 

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:
使用 API:
keybd_event / MapVirtualKey / GetKeyState
その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。
    :
このページのトップへ移動します。 1.タブキーが押されたどうかを取得する
共通部分

Option Explicit   'SampleNo:002  2002.04.16   @ 2006.12.28

'仮想キーの押下状態を取得する(P1064)
Private Declare Function GetKeyState Lib "user32" _
  (ByVal nVirtKey As Long) As Integer
'キーストロークをシミュレートする(P1065)
Private Declare Sub keybd_event Lib "user32.dll" _
  (ByVal bVk As Byte, ByVal bScan As Byte, _
  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
'仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067)
Private Declare Function MapVirtualKey Lib "user32" _
  Alias "MapVirtualKeyA" (ByVal wCode As Long, _
  ByVal wMapType As Long) As Long
Private Const VK_CAPITAL = &H14
Private Const VK_INSERT = &H2D
Private Const VK_SHIFT = &H10
Private Const VK_NUMLOCK = &H90
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2



タブキーが押されたかどうかを取得

Private Sub Text1_LostFocus()
'タブキーが押されたか?調査
  If GetKeyState(vbKeyTab) < 0 Then
    Label2.Caption = "タブキーが押されました。"
  Else
    Label2.Caption = ""
  End If
End Sub


Shift キーとタブキーが押されたかどうかを取得

Private Sub Timer1_Timer()
  If GetKeyState(vbKeyTab) < 0 And _
              GetKeyState(VK_SHIFT) < 0 Then
    Label1.Caption = "Shift キーとタブキーが押されました。"
  ElseIf GetKeyState(vbKeyTab) < 0 Then
    Label1.Caption = "タブキーが押されました。"
  Else
    Label1.Caption = ""
  End If
End Sub



通常、KeyDown イベントおよび KeyUp イベントでは、Tab キーのイベントは発生(取得できない)しません。
Tab キーが押されたかを取得するには、すべてのコントロールの TabStop を False に設定するか、GetKeyState API 関数を使用してタイマーイベントで監視するか、LostFocus イベントで関数を呼び出せば実現できます。

このページのトップへ移動します。 2.特殊キーの状態を取得及び設定
(1) CapsLock キーの状態を取得及び設定する
(2) Insert キーの状態を取得及び設定する
(3) NumLock キーの状態を取得及び設定する

Private Sub Command3_Click()
'CapsLock キーをクリック
  Call keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)
  Call keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub

Private Sub Command4_Click()
'Insert キーをクリック
  Call keybd_event(VK_INSERT, MapVirtualKey(VK_INSERT, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)
  Call keybd_event(VK_INSERT, MapVirtualKey(VK_INSERT, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub

Private Sub Command5_Click()
'NumLock キーをクリック
  Call keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0), KEYEVENTF_EXTENDEDKEY Or 0, 0)
  Call keybd_event(VK_NUMLOCK, MapVirtualKey(VK_NUMLOCK, 0), KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End Sub


Private Sub Command2_Click()
'各特殊キーの現在の状態を取得(下位ビットを取得 1=ON 0=OFF)
  If GetKeyState(vbKeyCapital) And &H1 Then
    Label3.Caption = "CapsLook キーはオンの状態です。"
  Else
    Label3.Caption = "CapsLook キーはオフの状態です。"
  End If
  If GetKeyState(vbKeyNumlock) And &H1 Then
    Label4.Caption = "Numlock キーはオンの状態です。"
  Else
    Label4.Caption = "Numlock キーはオフの状態です。"
  End If
  If GetKeyState(vbKeyInsert) And &H1 Then
    Label5.Caption = "Insert キーはオンの状態です。"
  Else
    Label5.Caption = "Insert キーはオフの状態です。"
  End If
End Sub


タブキー同様、VBのKeyDown イベントでは発生しないNumLockキー等のトグル状態もこのようにすれば取得できます。

MapVirtualKey APIでスキャンコードを得ることでWindows2000以降のShift キー等の動作不良にも対応。Win2000以前ならkeybd_eventAPI単独使用でも問題なく動作するようです。

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


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


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


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


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
KeyDown イベント KeyPress イベント Tab キー タブキー シフトキー
キャプスロックキーの状態を取得及び設定する インサートキーの状態を取得及び設定する ニューメリックロックキーの状態を取得及び設定する
特殊キーのON OFF状態を取得 特殊キーのON OFF状態を設定


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