會(huì)員登錄 - 用戶注冊(cè) - 網(wǎng)站地圖 Office中國(office-cn.net),專業(yè)Office論壇
當(dāng)前位置:主頁 > 技巧 > Access技巧 > API > 正文

如何檢測(cè)以及設(shè)置鍵盤狀態(tài)

時(shí)間:2009-04-21 17:39 來源:access911.net 作者:佚名 閱讀:

 

 

 

問題:

如何檢測(cè)以及設(shè)置鍵盤狀態(tài)

 

方法一:

原本想說使用SendKeys來模擬按這三個(gè)Key,但是不會(huì)動(dòng),只好,再使用API來完成這些程序都用到兩次keybd_event,第一次模擬鍵按下,第二次模擬放開鍵,而我查MSDN的文件,說SetNumLock只在NT上有效,95上沒有作用,還真的呢!不過有時(shí)會(huì)成功個(gè)一次,實(shí)在不了解為何如此。

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 GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2

Public Sub SetNumLock(ByVal bLock As Boolean)
Dim i As Boolean, ScanCode As Long
i = CBool(GetKeyState(vbKeyNumlock) And vbShiftMask)
If i <> bLock Then
   ScanCode = MapVirtualKey(vbKeyNumlock, 0)
   Call keybd_event(vbKeyNumlock, ScanCode, 0, 0)
   Call keybd_event(vbKeyNumlock, ScanCode, KEYEVENTF_KEYUP, 0)
End If
End Sub
Public Sub SetScrollLock(ByVal bLock As Boolean)
Dim i As Boolean, ScanCode As Long
i = CBool(GetKeyState(vbKeyScrollLock) And vbShiftMask)
If i <> bLock Then
   ScanCode = MapVirtualKey(vbKeyScrollLock, 0)
   Call keybd_event(vbKeyScrollLock, ScanCode, 0, 0)
   Call keybd_event(vbKeyScrollLock, ScanCode, KEYEVENTF_KEYUP, 0)
End If
End Sub
Public Sub SetCapsLock(ByVal bLock As Boolean)
Dim i As Boolean, ScanCode As Long
i = CBool(GetKeyState(vbKeyCapital) And vbShiftMask)
If i <> bLock Then
   ScanCode = MapVirtualKey(vbKeyCapital, 0)
   Call keybd_event(vbKeyCapital, ScanCode, 0, 0)
   Call keybd_event(vbKeyCapital, ScanCode, KEYEVENTF_KEYUP, 0)
End If
End Sub

Private Sub Command1_Click()
Call SetNumLock(True)
End Sub


 

方法二:

直接取得鍵盤狀態(tài)修改后再傳回就行了,代碼如下:
Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long 
Private Const VK_NUMLOCK = &H90
Private Const VK_SCROLL = &H91
Private Const VK_CAPITAL = &H14
Public Sub setKeyState(vkkey As Byte, kset As Boolean)
Dim s(255) As Byte
Call GetKeyboardState(s(0))
If kset Then 
    s(vkkey) = 1
Else
    s(vkkey) = 0
End If
Call SetKeyboardState(s(0))
End Sub

'若要設(shè)定CapsLock只要使用
'setKeyState VK_CAPITAL, True
'解除的話只要使用
'setKeyState VK_CAPITAL, False


 

方法三:


建立一個(gè)keyboard類,然后調(diào)用實(shí)例即可
Option Compare Database

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 Const vbKeyScrollLock = 145

Private Const SPI_GETKEYBOARDDELAY = 22

Private Const SPI_SETKEYBOARDDELAY = 23

Private Const SPI_GETKEYBOARDSPEED = 10

Private Const SPI_SETKEYBOARDSPEED = 11

'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

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))

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


(責(zé)任編輯:admin)

頂一下
(0)
0%
踩一下
(0)
0%
發(fā)表評(píng)論
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
評(píng)價(jià):