如何在NumLock为关闭状态时还能从小键盘输入数字.

juit 2003-08-25 09:25:56
如题!
...全文
169 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
juit 2003-08-29
  • 打赏
  • 举报
回复
我后来用到的办法,老是让NUM LOCK亮到那里,呵呵.
Option Explicit
Const KEYEVENTF_EXTENDEDKEY = &H1
Const KEYEVENTF_KEYUP = &H2

'用来判断一个指定虚拟键的状态包括CapsLock,NumLock,ScrollLock()
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
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 MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long


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 TxtCommand_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 144 Then
SetNumLock (True)
End If
End Sub
buffaloes 2003-08-27
  • 打赏
  • 举报
回复
of123() 的方法不错!
pigpag 2003-08-26
  • 打赏
  • 举报
回复
我是笔记本的,没法调试。
of123 2003-08-26
  • 打赏
  • 举报
回复
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 45
Text1 = Text1 & "0"
Case 35
Text1 = Text1 & "1"
Case 40
Text1 = Text1 & "2"
Case 34
Text1 = Text1 & "3"
Case 37
Text1 = Text1 & "4"
Case 12
Text1 = Text1 & "5"
Case 39
Text1 = Text1 & "6"
Case 36
Text1 = Text1 & "7"
Case 38
Text1 = Text1 & "8"
Case 33
Text1 = Text1 & "9"
Case 46
Text1 = ""
End Select
Text1.SelStart = Len(Text1)
End Sub
lwm1977 2003-08-26
  • 打赏
  • 举报
回复
突然想到“键值转换”
就像“路由转换”一样
将不是数字的键值,转换成数字键值
lwm1977 2003-08-26
  • 打赏
  • 举报
回复
强力推荐拆掉NumLock键的办法



人类的欲望就是复杂
boyzhang 2003-08-26
  • 打赏
  • 举报
回复
对了,用全局钩子也可以,获取小键盘按下的事件,如果不是数字,改为数字,再还原到消息中


:)
boyzhang 2003-08-26
  • 打赏
  • 举报
回复
Private Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer
Private Declare Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

先用GetAsyncKeyState获取小键盘上的键是否被按下,如果被按下,就用keybd_event模拟按下小键盘上相应的值......
pigpag 2003-08-25
  • 打赏
  • 举报
回复
用GetKeyState()获取Numlock的状态,确定是否切换Numlock状态

Private Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Long) As Integer
Private Declare Function MapVirtualKey Lib "user32" _
Alias "MapVirtualKeyA" _
(ByVal wCode As Long, ByVal wMapType As Long) 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 Const KEYEVENTF_KEYUP = &H2
Private Const KEYEVENTF_EXTENDEDKEY = &H1

If GetKeyState(vbKeyNumlock)=0 Then
Call keybd_event(vbKeyNumlock, _
MapVirtualKey(vbKeyNumlock, 0), _
KEYEVENTF_EXTENDEDKEY Or 0, 0)

Call keybd_event(vbKeyNumlock, MapVirtualKey(vbKeyNumlock, 0), _
KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
End If
juit 2003-08-25
  • 打赏
  • 举报
回复
楼上的,如何强行打开呢?
pigpag 2003-08-25
  • 打赏
  • 举报
回复
强行打开Numlock不就行了?
viena 2003-08-25
  • 打赏
  • 举报
回复
把NumLock键拆掉
wxyq 2003-08-25
  • 打赏
  • 举报
回复
去买个只有数字的小键盘啊!
lxcc 2003-08-25
  • 打赏
  • 举报
回复
但是在很多程序里面都可以啊,像一些POS前台收银时,按不按numlock都没有什么影响的.

键盘不一样吧!POS机上的键盘不是我们通常用的102-105键的那种
馮強 2003-08-25
  • 打赏
  • 举报
回复
那种小键盘,只能输入数字,numlock在电路板上就被置为数字方式。
馮強 2003-08-25
  • 打赏
  • 举报
回复
除非小键盘坏掉。
juit 2003-08-25
  • 打赏
  • 举报
回复
但是在很多程序里面都可以啊,像一些POS前台收银时,按不按numlock都没有什么影响的.
AustinLei 2003-08-25
  • 打赏
  • 举报
回复
这个不行吧!
pigpag 2003-08-25
  • 打赏
  • 举报
回复
如果你只让客户操作小键盘,那么只要用KeyDown事件:

比如检测到上箭头,就是8,以次类推
叶帆 2003-08-25
  • 打赏
  • 举报
回复
你可以做键盘钩子,管它是否输入数字,你通通把小键盘的输入转换成数字。

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧