高分求助闭掉键盘的问题!!!

ysfish 2003-12-13 01:28:17
在作一个像银行里一样刷磁卡的系统,现在遇到这样的问题

在由用户用外接的小键盘输入一些数据的时候,如何能将操作员所用的大键盘闭掉?
同样,在里面的操作员输入的时候,如何将外面的小键盘闭掉?

假设将两个键盘同时接在com1口(键盘口)上时,应如何写?

假设将外接小键盘接在com2口(鼠标口)上时,即将外接小键盘和鼠标同时接在com2口上时,应如何写?
...全文
3 点赞 收藏 4
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2003-12-13
问:如何可以在VB中实现对整个系统鼠标和键盘的屏蔽

  答:我们常见一些导览系统或教学系统,会自动移动Mouse与Keyin字,而那个时候,我们不管Keyin或动Mouse都没有效,直到完成了导览系统的某个动作後才让使用者可以移动Mouse与做Keyin的动作;想做到这个,要借重JournalPlayBack Hook。

  JournalPlayBack Hook,它和JournalRecord Hook合称Journal Hook,它们作用范围是整个System,也就是挂上这个Hook後,影响的层面不单是这个Process,而是有的Process,而这两Hook又不用写在Dll之中,所以很好用。

  首先我们要知道由键盘和Mouse输入等的硬体讯息,会存到一个System Queue而後OS会该System Queue看有没有讯息在其中,若有则撷取出来,看目前Active的Window是谁将讯息Post给它。而挂上JournalRecord Hook时,当有讯息被撷取出来时,会先执行他们所设定的Hook Function(在vb中,一定要放在.BAS档之中)。这可以做什麽事呢?

  例如我们可以Check整个系统是否有按了键盘或有没有移动Mouse(一般来说,KeyUp,KeyDown, MouseMove等Event只有Form在Active 时才收得到,挂上JournalRecord hook後,执行Hook的thread便能收到所有这些讯息)。再如,它既然能收到Keyboard、Mouse的讯息,那便可以将收到的讯息记录起来(记录於Memory或Disk都可以),之後再依方才的顺序重新将讯息放送出来,可重新执行方才的动作(这不就是巨集的作法吗),或许它叫JournalRecord便是这个原因。再来便是播放记录讯息的问题了,如果一面播放,一面有其他讯息插队(如移动Mouse),那就不对了,所以JournalPlayBack这个Hook它会让Mouse、Keyboard都失效,当OS 要求读System Queue时,便会启动这个Hook,就在此时,我们可以把方才记录起来的讯息丢出一个出来,OS再要求读System Queue时,再丢下一个讯息,如此达重播的效果(所以才叫JournalPlayBack),正因它会让键盘、Mouse失效,拿它来做导览、教学系统的自动Move Mouse或文字显示是最适合的了。

  Mouse的自动导引系统制作方式,可叁考如何自动移动Mouse

'以下在.Bas中
Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)
Const WM_MOUSELAST = &H209
Const WM_MOUSEFIRST = &H200
Public Const WM_KEYLAST = &H108
Public Const WM_KEYFIRST = &H100
Public Const WH_JOURNALRECORD = 0
Public Const WH_JOURNALPLAYBACK = 1

Type EVENTMSG
message As Long
paramL As Long
paramH As Long
time As Long
hwnd As Long
End Type
Declare Function SetWindowsHookEx Lib "user32" Alias _
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public hNxtHook As Long ' handle of Hook Procedure
Public msg As EVENTMSG

Sub EnableHook()
hNxtHook = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf HookProc, App.hInstance, 0)
End Sub
Sub FreeHook()
Dim ret As Long
ret = UnhookWindowsHookEx(hNxtHook)
End Sub
Function HookProc(ByVal code As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
HookProc = CallNextHookEx(hNxtHook, code, wParam, lParam)
End Function

'以下在Form中,需求:一个Command1, 一个text1
Private Sub Command1_Click()
Dim str5 As String, len5 As Long, i As Long

Call EnableHook
str5 = "这是一个测试JournalPlayBackHook的程式"
len5 = Len(str5)
For i = 1 To len5
Text1.Text = Mid(str5, 1, i)
Text1.Refresh
Sleep (200)
Next
Call FreeHook
End Sub
回复
ysfish 2003-12-13
我现在只能将两个键盘全接在com1口上了!!

我的想法是这样的:
现在两个键盘都可以同时工作的,因为一个是在里面操作员就的大键盘,就是我们平时就的那种,另一个小键盘是在外面让客户就的,就像银行里面一样的,因为可以同时工作,所以在一方输入的时候,另一方如果不小心按到什么,会造成数据的错误,因为同样是和money有关的,所以这样的话太危险,所以我才想到在一方输入的时候,屏蔽另一方,可不知如何实现,所以求助大家,提供别的方法解决这个问题也可!
我现在只限于用vb
回复
踏平扶桑 2003-12-13
http://www.baidu.com/baidu?tn=baidu&ct=0&ie=gb2312&bs=%C6%C1%B1%CE%BC%FC%C5%CC&sr=&z=&cl=3&f=8&word=vb+%C6%C1%B1%CE%BC%FC%C5%CC
不知道这个对楼主有用没有
或者可以用汇编,一直查询小键盘的端口,只要有信号就屏蔽大键盘的操作。
回复
ysfish 2003-12-13
能提供一些这方面的资料的,同样给分!!
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7451

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告