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


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



Windowsのキーボートには、何れの場合でも必ず NumLockキーがあります。このNumLockキーとは、「IT用語辞典」によると下記のように 説明されています。

 

テンキーの使い方を切り替えるキー。

NumLockキーはCapsLockキーと同様に押すたびに機能のオン・オフが切り替わり、NumLockがオンになっている時はテンキーは数字入力キーとして働く。
NumLockがオフになっている時は、テンキーはカーソルキーとして働くようになっている。
テンキーのないキーボードでも、一部のキーを数字入力専用キーに切り替えられ るものがあり、この切り替えもNumLockキーで行なう。

 

出典元は、下記のとおりです。

 

Windows APIとは

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

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

 

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

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

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

 

 

強制的にNumLockキーをオンにするプロシージャ

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

 
API利用のための宣言部分
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

 

Windows APIとは

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

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

 

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

個々のソフトウェアの開発者がソフトウェアの持つすべての機能をプログラミングするのは困難で無駄が多いため、多くのソフトウェアが共通して利用する機能は、OSやミドルウェアなどの形でまとめて提供されている。
個々の開発者は規約に従ってその機能を「呼び出す」だけで、自分でプログラミングすることなくその機能を利用したソフトウェアを作成することができる。

 

Functionプロシージャの作成
'NumLockの状態を変更します。

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

 

 

解説

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

  • If NumLockState <> True Then
    このIF構文で強制的にNumLockキーをオンにしています。
        'Win95/98系
        If OsVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then
            keys(VK_NUMLOCK) = 1
            SetKeyboardState keys(0)
   
        'WinNT系
        ElseIf OsVer.dwPlatformId = VER_PLATFORM_WIN32_NT Then
            'Simulate Key Press
            keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
            'Simulate Key Release
            keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
        End If
  • この処理自体は、オンであればオフに、オフであればオンに切り替えるものです。よって、If 〜 Else 〜 End If 構文を利用すれば、オン、オフを自在に切り替えできます。

 

 

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

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

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

Function Display_NUMLOCK()
  
    Dim NumLockState As Boolean
    Dim keys(0 To 255) As Byte
    GetKeyboardState keys(0)

    NumLockState = keys(VK_NUMLOCK)
    
    If NumLockState = True Then
      
        Display_NUMLOCK = "現在、NumLockはオンです"
        
    Else
    
        Display_NUMLOCK = "現在、NumLockはオフです"

    End If
    
    MsgBox Display_NUMLOCK
    
End Function

 

 

 

注意点

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

 

 

関連ページ

 

下記の「ダウンロード」をクリックして下さい。圧縮していますので、適当なフォルダーへ解凍しご利用下さい。

 

 


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


 

-Microsoft Access Club-