Microsoft Access Club >SampleFile >インデックス >このページ >次頁 < 前項  サイト内検索


ScrollLock操作を制御する方法 - Windows APIの使用:SampleFile216



今回は、ScrollLock (ScrollLock key)を制御する方法ご紹介しま す。このScrollLockキーとは、「IT用語辞典」によると下記のように 説明されています。

キーボード上にある「ScrollLock」と刻印されたキー。

CapsLockキーやNumLockキーと 同様に、押すたびにオン・オフが切り替わる。
元々は3270端末でカーソルを移動させないようにするキーだったが、パソコンでは本来の用途で使用することはほとんどない。 そのため、ScrollLockキーに別のショートカット機能を割り当てて使用することがある。
その一例がExcelで、ScrollLockがオンになった状態でカーソルキーを押すと、選択したセルは そのままでワークシート全体が移動する。

Windows APIとは

Windows API (Application Program Interface)をAccessVBAで利用するためには、宣言を記述しなくてはいけません。これは定型文ですから、覚える必要は ありません。サンプルファイルのモジュール欄に纏めてありますから、必要なときにダウンロードしてご利用下さい。

このAPIは、「IT用語辞典」によると下記のように説明されています。

あるプラットフォーム(OSやミドルウェア)向けのソフトウェアを開発する際に使用できる命令や関数の集合のこと。 また、それらを利用するためのプログラム上の手続きを定めた規約の集合。

個々のソフトウェアの開発者がソフトウェアの持つすべての機能をプログラミングするのは困難で無駄が多いため、多くのソフトウェアが共通して利用する機能は、OSやミドルウェアなどの形でまとめて提供されている。

個々の開発者は規約に従ってその機能を「呼び出す」だけで、自分でプログラミングすることなくその機能を利用したソフトウェアを作成することができる。

API利用のための宣言部分

ScrollLockキーをオン、オフにするプロシージャを作成します。まず、宣言部分を記述し、次にFunctionプロシージャとして作成します。

Option Compare Database
Option Explicit

'以下、宣言です。
'NumLock、CapsLock、ScrollLock、共通。
Private Type OSVERSIONINFO
    
     dwOSVersionInfoSize As Long
     dwMajorVersion As Long
     dwMinorVersion As Long
     dwBuildNumber As Long
     dwPlatformId As Long
     'Maintenance string for PSS usage
     szCSDVersion As String * 128
        
End Type

'API declarations:
Private Declare Function GetVersionEx Lib "kernel32" _
        Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
	ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Declare Function GetKeyboardState Lib "user32" _
						(pbKeyState As Byte) As Long

Private Declare Function SetKeyboardState Lib "user32" _
						(lppbKeyState As Byte) As Long

'Constant declarations:
Const VK_NUMLOCK = &H90
Const VK_SCROLL = &H91
Const VK_CAPITAL = &H14
    
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2
    
Const VER_PLATFORM_WIN32_NT = 2
Const VER_PLATFORM_WIN32_WINDOWS = 1

FunctionプロシージャCommand_SCROLLLOCKの作成

'ScrollLockキーを切り替える Win APIです。

Function Command_SCROLLLOCK()

Dim OsVer As OSVERSIONINFO
Dim ScrollLockState As Boolean
OsVer.dwOSVersionInfoSize = Len(OsVer)
GetVersionEx OsVer
Dim keys(0 To 255) As Byte
GetKeyboardState keys(0)
ScrollLockState = keys(VK_SCROLL)
      
'オフであれば強制的にオンに切り替えます。
If ScrollLockState <> True Then
    
    'Win95/98系
    If OsVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
        keys(VK_SCROLL) = 1
        SetKeyboardState keys(0)
    'WinNT系
    ElseIf OsVer.dwPlatformId = VER_PLATFORM_WIN32_NT Then
        keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
        keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
     End If
        
'オンであれば強制的にオフに切り替えます。
Else
    
    'Win95/98系
    If OsVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
        keys(VK_SCROLL) = 1
        SetKeyboardState keys(0)
    'WinNT系
    ElseIf OsVer.dwPlatformId = VER_PLATFORM_WIN32_NT Then
       keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
       keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
    End If
        
End If

End Function
解説

フォームを作成し、コマンドボタンのクリック時イベントに記述するなどして利用して下さい。

解説

Win95/98系とWinNT(Win2000、WinXP)とで処理が異なっています。

If ScrollLockState <> True Then

このIF構文で強制的にScrollLockキーをオンにしています。

        'Win95/98系
If OsVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
    keys(VK_SCROLL) = 1
    SetKeyboardState keys(0)
   
'WinNT系
ElseIf OsVer.dwPlatformId = VER_PLATFORM_WIN32_NT Then
    keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End If
Else

このIF構文のElse以下で強制的にScrollLockキーをオフにしています。

'Win95/98系
If OsVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
    keys(VK_SCROLL) = 1
    SetKeyboardState keys(0)
   
'WinNT系
ElseIf OsVer.dwPlatformId = VER_PLATFORM_WIN32_NT Then
    keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
    keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
End If
  • オン、オフ共に処理するプロシージャは同じです。オンの状態であればオフになり、オフの状態であればオンに切り替わります。

ScrollLockキーの状態を取得するプロシージャ

前述のプロシージャを一部変更して、フォームを開いた時にScrollLockキーの状態をメッセージボックスに表示させるプロシージャをご紹介します。

'ScrollLockの状態を取得します。

Function Display_SCROLLLOCK()
  
    Dim ScrollLockState As Boolean
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)

    ScrollLockState = keys(VK_SCROLL)
    
    If ScrollLockState = True Then
        Display_SCROLLLOCK = "現在、ScrollLockはオンです"
    Else
        Display_SCROLLLOCK = "現在、ScrollLockはオフです"
    End If
    
    MsgBox Display_SCROLLLOCK
    
End Function
解説

プロシージャを実行すると、現在のScrollLockキーの状態を取得しメッセージボックスに表示します。

注意点

  1. Windows APIでScrollLockを切り替え直後には、Function Display_SCROLLLOCK プロシージャでScrollLockの状態を正しく取得することはできません。
  2. 宣言部分にある &H90、&H2・・・などは、予約定数といいますが、Accessを利用する限り無視してもらって結構かと思います。
  3. 職場や学校で、いたずら半分でこの機能を組み込まないようにしましょう。

関連ページ

ページの先頭へ 前ページへ戻る

 


ScrollLock操作を制御する方法 - Windows APIの使用:SampleFile216


 

-Microsoft Access Club-