[AccessD] Num Lock

Drew Wutka DWUTKA at Marlow.com
Wed Mar 26 14:54:02 CDT 2008


Keyboard Class:

Option Explicit
' Declare Type for API call:
Private Type OSVERSIONINFO
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion As String * 128   '  Maintenance string for PSS usage
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)

' Keyboard support functions.
' NOTE: Setting the toggle states will NOT affect the
' keyboard lights. These changes merely affect the current
' process, not the entire machine.

' From "VBA Developer's Handbook"
' by Ken Getz and Mike Gilbert
' Copyright 1997; Sybex, Inc. All rights reserved.

' Not all VBA implementations include this constant!
Private Const vbKeyScrollLock = 145

Private Const SPI_GETKEYBOARDDELAY = 22
Private Const SPI_SETKEYBOARDDELAY = 23
Private Const SPI_GETKEYBOARDSPEED = 10
Private Const SPI_SETKEYBOARDSPEED = 11
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

' SystemParametersInfo flags
Private Const SPIF_UPDATEINIFILE = &H1
Private Const SPIF_SENDWININICHANGE = &H2

Private Declare Function SystemParametersInfo Lib "user32" _
 Alias "SystemParametersInfoA" (ByVal uAction As Long, _
 ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long

' This is a made-up constant.
Private Const SPIF_TELLALL = SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE

Private Declare Function GetKeyboardType Lib "user32" (ByVal lngTypeFlag
As Long) As Long
Private Declare Function GetKeyState Lib "user32" (ByVal lngVirtKey As
Long) As Integer
Private Declare Function GetKeyboardState Lib "user32" (bytKeyState As
Byte) As Long
Private Declare Function SetKeyboardState Lib "user32" (bytKeyState As
Byte) As Long
Private Declare Function GetCaretBlinkTime Lib "user32" () As Long
Private Declare Function SetCaretBlinkTime Lib "user32" (ByVal wMSeconds
As Long) As Long

Property Get KeyboardType() As Long
    ' Determine the type of keyboard on the system.
    ' 1   IBM PC/XT or compatible (83-key) keyboard
    ' 2   Olivetti "ICO" (102-key) keyboard
    ' 3   IBM PC/AT (84-key) or similar keyboard
    ' 4   IBM enhanced (101- or 102-key) keyboard
    ' 5   Nokia 1050 and similar keyboards
    ' 6   Nokia 9140 and similar keyboards
    ' 7   Japanese keyboard
    KeyboardType = GetKeyboardType(0)
End Property

Property Get FunctionKeys() As Long
    ' Determine the number of function keys on the keyboard.
    ' 1   10
    ' 2   12 (sometimes 18)
    ' 3   10
    ' 4   12
    ' 5   10
    ' 6   24
    ' 7   Hardware dependent and specified by the OEM
    FunctionKeys = GetKeyboardType(2)
End Property

Property Get Capslock() As Boolean
    ' Return the Capslock toggle.
    Capslock = CBool(GetKeyState(vbKeyCapital) And 1)
End Property

Property Get Numlock() As Boolean
    ' Return the Numlock toggle.
    Numlock = CBool(GetKeyState(vbKeyNumlock) And 1)
End Property

Property Get ScrollLock() As Boolean
    ' Return the ScrollLock toggle.
    ' ScrollLock = CBool(GetKeyState(vbKeyScrollLock) And 1)
End Property

Property Let Capslock(Value As Boolean)
    ' Set the Capslock toggle.
    Call SetKeyState(vbKeyCapital, Value)
End Property

Property Let Numlock(Value As Boolean)
    ' Set the Numlock toggle.
    Call SetKeyState(vbKeyNumlock, Value)
End Property

Property Let ScrollLock(Value As Boolean)
    ' Set the ScrollLock toggle.
    Call SetKeyState(vbKeyScrollLock, Value)
End Property

Private Sub SetKeyState(intKey As Integer, fTurnOn As Boolean)
    '' Retrieve the keyboard state, set the particular
    '' key in which you're interested, and then set
    '' the entire keyboard state back the way it
    '' was, with the one key altered.
    Dim abytBuffer(0 To 255) As Byte
'
'   Call GetKeyboardState(abytBuffer(0))
'   abytBuffer(intKey) = CByte(Abs(fTurnOn))
'   Call SetKeyboardState(abytBuffer(0))
Dim o As OSVERSIONINFO
Dim NumLockState As Boolean
Dim ScrollLockState As Boolean
Dim CapsLockState As Boolean

o.dwOSVersionInfoSize = Len(o)
GetVersionEx o
Dim keys(0 To 255) As Byte
GetKeyboardState keys(0)

' NumLock handling:
NumLockState = keys(VK_NUMLOCK)
If intKey = vbKeyNumlock Then  'Turn numlock on
  If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '===== Win95
    Call GetKeyboardState(abytBuffer(0))
    abytBuffer(intKey) = CByte(Abs(fTurnOn))
    Call SetKeyboardState(abytBuffer(0))
  ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '===== WinNT
  '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

' CapsLock handling:
CapsLockState = keys(VK_CAPITAL)
If intKey = vbKeyCapital Then  'Turn capslock on
  If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '===== Win95
    Call GetKeyboardState(abytBuffer(0))
   abytBuffer(intKey) = CByte(Abs(fTurnOn))
   Call SetKeyboardState(abytBuffer(0))
  ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '===== WinNT
  'Simulate Key Press
    keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
  'Simulate Key Release
    keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY _
       Or KEYEVENTF_KEYUP, 0
  End If
End If

' ScrollLock handling:
ScrollLockState = keys(VK_SCROLL)
If intKey = vbKeyScrollLock Then  'Turn Scroll lock on
  If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then  '===== Win95
    Call GetKeyboardState(abytBuffer(0))
   abytBuffer(intKey) = CByte(Abs(fTurnOn))
   Call SetKeyboardState(abytBuffer(0))
  ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then   '===== WinNT
  'Simulate Key Press
    keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0
  'Simulate Key Release
    keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY _
      Or KEYEVENTF_KEYUP, 0
  End If
End If
End Sub

Property Let Delay(Value As Long)
    ' Sets the keyboard repeat-delay setting.
    ' Only values 0 through 3 are acceptable. Others will be
    ' set back to 0.
    Call SystemParametersInfo(SPI_SETKEYBOARDDELAY, Value, 0,
SPIF_TELLALL)
End Property

Property Get Delay() As Long
    Dim lngValue As Long
    Call SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, lngValue, 0)
    Delay = lngValue
End Property

Property Let Speed(Value As Long)
    ' Sets the keyboard repeat-speed setting.
    ' Only values 0 through 31 are acceptable. Others will be
    ' set back to 0.
    Call SystemParametersInfo(SPI_SETKEYBOARDSPEED, Value, 0,
SPIF_TELLALL)
End Property

Property Get Speed() As Long
    ' Get the keyboard repeat-speed setting.
    Dim lngValue As Long
    Call SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, lngValue, 0)
    Speed = lngValue
End Property

Property Get CaretBlinkTime() As Long
    ' Retrieve the number of milliseconds
    ' between blinks of the caret.
    ' SYSTEM RESOURCE. Change this with care.
    CaretBlinkTime = GetCaretBlinkTime()
End Property

Property Let CaretBlinkTime(Value As Long)
    ' Set the number of milliseconds
    ' between blinks of the caret.
    ' SYSTEM RESOURCE. Change this with care.
    ' Allowable values: 200 to 1200 (multiples of 100)
    Call SetCaretBlinkTime(Value)
End Property


-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Rocky Smolin
at Beach Access Software
Sent: Wednesday, March 26, 2008 2:04 PM
To: 'Access Developers discussion and problem solving'
Subject: [AccessD] Num Lock

 
Dear List:
 
I need to see if the NumLock key is on, and if not, set it on (stops the
bound form from moving to another record when 3 or 9 is pressed).
 
I see where you can use SendKeys to send {NUMLOCK} but of course the
popular
wisdom is not to use SendKeys.
 
No help from help.
 
Is there a way to poll and set the NumLock through vba?
 
MTIA
 
Rocky
 
-- 
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com
The information contained in this transmission is intended only for the person or entity to which it is addressed and may contain II-VI Proprietary and/or II-VI Business Sensitive material. If you are not the intended recipient, please contact the sender immediately and destroy the material in its entirety, whether electronic or hard copy. You are notified that any review, retransmission, copying, disclosure, dissemination, or other use of, or taking of any action in reliance upon this information by persons or entities other than the intended recipient is prohibited.





More information about the AccessD mailing list