利用VB建立鼠标键盘操作回放
vb键盘与鼠标事件过程上机指导

键盘与鼠标事件过程(上机指导)教学要求:掌握键盘事件KeyPress、KeyDown、KeyUp的基本方法;掌握鼠标事件MouseDown、MouseUp、MouseMove的基本方法;能利用键盘事件、鼠标事件进行程序设计。
知识点:各键盘事件的使用方法;各鼠标事件的使用方法。
内容导航:一、键盘事件(一)KeyPress事件该事件在单击键盘时发生。
它可获得按键的KeyAscii码,并不是单击任意一个键都会发生KeyPress事件,该事件只对会产生ASCII码的键有反应。
在窗体上画一个控件(指上面所讲的可以发生KeyPress事件的控件),双击该控件,进入程序代码窗口后,从“过程”框中选取KeyPress,即可以定义KeyPress事件过程。
一般格式为:Private Sub Command1_KeyPress(KeyAscii As Integer)… …End Sub(二)KeyDown事件和KeyUp事件当用户按下键盘上的任意一个键,便触发该对象的KeyDown事件,释放按键则触发KeyUp 事件。
由于按下键盘的键往往会立即放开,所以这两个事件的使用差别并不大。
KeyDown事件和KeyUp事件的参数有两种形式,其中Index As Integer只用于控件组,而KeyCode As Integer, Shift As Integer用于单个控件。
二、鼠标事件鼠标事件是由用户操作鼠标而引发的事件。
(一)Click事件用户单击鼠标键时发生,格式如下:Private Sub控件名_Click ( [ index As Integer ] )其中Index用于当控件是控件数组时传递的参数。
(二)DbClick事件用户双击鼠标键时发生,格式如下:Private Sub控件名_DbClick ( [ index As Integer ] )(三)MouseDown事件用户按下鼠标上的任一按钮时,就会引发该事件。
VB程序设计键盘与鼠标事件过程

VB程序设计键盘与鼠标事件过程11.1 键盘事件在Visual Basic中,窗体和接受键盘输入的控件都能识别这三种键盘事件:一是KeyPress,按下对应某ASCII字符的键;二是KeyDown,按下键盘的任意键;三是KeyUp,释放键盘的任意键。
只有获得焦点的对象才能接受键盘事件。
11.1.1 KeyPress事件当按下某个键时,将触发拥有输入焦点(Focus)的那个控件的KeyPress事件,返回“所按字符”的ASCII码。
语法格式:Sub Object_KeyPress(KeyAscii As Integer)或Sub Object_KeyPress([index As Integer,]KeyAscii As Integer) 说明:1、Object:是指窗体或控件对象名;2、index:一个整数,它用来惟一标识一个控件数组中的控件;3、KeyAscii:是指KeyAscii参数返回对应ASCII字符代码的整型数值;KeyPress事件带有一个参数,这个参数有两种形式。
第一种形式为:Index As Integer,这种形式只用于控件数组;第二种形式为:KeyAscii As Integer,这种形式只用于单个控件。
11.1.2 KeyDown事件和KeyUp事件当按下或松开某个键时,将触发拥有输入焦点(Focus)的那个控件的KeyDown事件或者KeyUp事件,返回键盘的直接状态。
KeyDown事件和KeyUp事件的参数也有两种形式:(1)Index As Integer 只用于控件数组。
(2)KeyCode As Integer,Shift As Integer 用于单个控件,本章只讨论这种形式。
语法格式为:Sub Object_KeyDown(KeyCode As Integer,Shift AsInteger)Sub Object_KeyUp(KeyCode As Integer,Shift As Integer)说明:1.KeyCode参数KeyCode表示按下的物理键,以“键”为准,而不是以“字符”为准。
VB模拟鼠标键盘动作

模拟鼠标键盘动作有些时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。
那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows 中响应键盘事件的机制。
当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。
如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。
当你按下一个键时,这个键的扫描码就被传给系统。
扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。
键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。
键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。
什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。
无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。
简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。
当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。
然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。
最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。
这个过程可以简单的如下表示:用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。
VB鼠标事件与键盘事件

VB鼠标事件与键盘事件SuB Form—MouseMove(Buttoil As Integer,Shift As Integer,x As Single,Y As Single)这3个鼠标事件过程具有相同的参数,它们把鼠标的信息传给过程。
(1)Button:被按下的鼠标按钮,可以取以下3个值。
(2)Shift:表示Shift、ctrl和Alt的状态。
如表6.7所示。
(3)x,Y:这两个值对应于当前鼠标的位置,采用ScaleMode属性指定的位置。
说明:(1)有些鼠标只有2个按键,或者虽有3个按键,但w:indows鼠标驱动程序不能识别中间按键。
在这种情况下,表6.6中的后4个参数值不能使用。
(2)对于单按鼠标器,它的按键定义为左按键。
如果鼠标带两个按键,并使用windows 的控制面板交换了鼠标器的左、右键,那么,当按右按键时,VB认为是按了左按键。
例如,如果按住Ctrl键,然后在坐标为(2000,3000)的点上按下鼠标器右键,则立即调用Forul—MouseDown过程,释放鼠标右键时,调用Form—MouseUp过程。
此时。
Button、Shift、x、Y这4个参数的值分别为2、2、2000和3000.(3)Shift是转换键,它指的是3个转换状态,包括Shift、ctrl和Alt。
这3个键分别以二进制方式表示,每个键用三位,即:Shift键为001,Ctrl键为010,Alt键为100。
当按下Shift键时,Shift参数的值为00l(十进制数1),当按下ctrl键时,Shift参数的值为010(十进制数2),而按下Alt键时,Shift参数的值为100(十进制数4)。
如果同时按下2个或3个转换键,则Shift参数的值即为上述两者或三者之和。
因此,Shift参数共可取8种值。
如何用vb实现模拟鼠标中键滚动

如何用vb实现模拟鼠标中键滚动!Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。
此参数里的各位可以是下列值的任何合理组合:MOOSE_EVENTF_ABSOLOTE:表明参数dX,dy含有规范化的绝对坐标。
如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。
此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。
要得到关于相对鼠标动作的信息,参见下面备注部分。
MOOSEEVENTFMOVE:表明发生移动。
M00SEEVENTF_LEFTDOWN:表明接按下鼠标左键。
M00SEEVENTF_LEFTUP:表明松开鼠标左键。
MOOSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
MOOSEEVENTF_RIGHTUP:表明松开鼠标右键。
MOOSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
MOOSEEVENTF_MIDDLEUP:表明松开鼠标中键。
MOOSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。
移动的数量由dwData给出。
dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLOTE的设置。
给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。
一个mickey表示鼠标移动的数量,表明鼠标已经移动。
dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLVTE的设置。
VB模拟按键终极教程

MakeKeyLparam = Val("&H" & s)
End Function
这个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) ,很简单吧。值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。
vb 键盘与鼠标事件过程

拖放有关的事件
与拖放有关的事件是dragdrop和dragover Dragdrop事件 事件:把控件拖到目标后放开鼠标产生一个dragdrop事件。 事件 该事件过程如下: Sub 对象名_dragdrop(source,y as single) …… end sub 参数解析: Source:是一个对象变量,类型为control,该参数含有被拖动对象的属性 X,Y:松开鼠标放下对象时鼠标光标的位置 Dragover事件 事件:用于图标的移动。拖动对象越过一个控件时产生一个dragover 事件 事件,该事件过程格式如下: Sub 对象名_dragover(source as control,x as single,y as single,state as integer) …… end sub
鼠标事件
鼠标键 鼠标键状态参数button设定,该参数是一个整数(16位),见下表
Button参数二进制值 Button参数十进制值 参数二进制值 参数十进制值
000 001 010 011 100 101 110 111 0 1 2 3 4 5 6 7 未按任何键
作用
左键被按下(默认) 右键被按下 左右键同时被按下 中间键被按下 按下中间与左键 按下中间与右键 3个键同时被按下
第十章 键盘与鼠标事件过程
Keypress事件
当一个控件或窗体拥有输入焦点时,该控件或窗体从键盘 上接受输入的信息。Keypress事件的一般格式: private sub 控件名_keypress(keyascii as integer) …… end sub 该事件有一个参数,这个参数有两种形式: 第一种形式是index as integer,只用于控件数组; 第二种形式是keyascii as integer ,用于单个控件,用来 识别按键的ascii码。 利用keypress事件可以对输入的值进行限制。
在VB中如何用API监控鼠标和键盘

End Sub
′具体的钩子程序,本例中该过程被包含在Module1中
Public Function MyKBHook(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long
If nCode>=0 then
Open "C:\Keyfile.txt" For Append As #1 '将键盘的操作记录在Keyfile.txt文件之中
'记录所操作的键、操作时间、日期操作时的按键状态,用16进制记录
Write #1,wParam,Hex(lParam),Date,time
键盘:
A:在Timer控件中不断使用GetAsyncKeyState取得按键信息
B:使用Hook。
如果是普通键盘钩子(WH_KEYBOARD),系统级的需要将回掉函数放在dll中,但VB不能写普通dll(不能是VB的ActiveX DLL),需要用其他编程工具写(如VC++、Delphi、Borland C++ Builder)
B:使用Hook。
如果是鼠标键盘钩子(WH_MOUSE),系统级的需要将回掉函数放在dll中,但VB不能写普通dll(不能是VB的ActiveX DLL),需要用其他编程工具写(如VC++、Delphi、Borland C++ Builder)
如果是鼠标键盘钩子(WH_MOUSE_LL),则本身就是系统级的,不需要dll,但只能在NT系统(WinNT4/2000/XP/2003)下使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用VB建立鼠标键盘操作回放很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用了Windows的Hook函数。
本文介绍如何通过使用VB来实现鼠标键盘操作的纪录和回放。
Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows消息,函数语法为:Public 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其中参数idHook指定建立的监视函数类型。
通过Windows MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同的消息监视类型,在这里我们将使用WH_JOURNALRECORD和WH_JOURNALPLAYBACK来监视键盘和鼠标操作。
参数lpfn 指定消息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。
函数的一般形式为:Hookproc (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;其中code为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。
只要在程序中建立这样一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。
在不需要监视系统消息时需要调用提供UnHookWindowsHookEx来解除对消息的监视。
WH_JOURNALRECORD和WH_JOURNALPLAYBACK类型是两种相反的Hook类型,前者获得鼠标、键盘动作消息,后者回放鼠标键盘消息。
所以在程序中我们需要建立两个消息函数,一个用于纪录鼠标键盘操作并保存到一个数组中,另一个用于将保存的操作返给系统回放。
下面是具体的程序实现:首先建立一个新工程,在Form1中加入三个CommandButton控件用于控制消息钩子,另外还可以增加若干Command或者TextBox控件用于检验操作回放的效果。
然后在工程中增加一个模块文件,在模块中加入以下定义和代码:Option ExplicitPublic Type EVENTMSGmessage As LongparamL As LongparamH As Longtime As Longhwnd As LongEnd TypePublic Declare Function CallNextHookEx Lib "user32" _(ByVal hHook As Long, _ByVal ncode As Long, _ByVal wParam As Long, _ByVal lParam As Long) As LongPublic Declare Function SetWindowsHookEx Lib "user32" _Alias "SetWindowsHookExA" _(ByVal idHook As Long, _ByVal lpfn As Long, _ByVal hmod As Long, _ByVal dwThreadId As Long) As LongPublic Declare Sub CopyMemoryT2H Lib "kernel32" _Alias "RtlMoveMemory" _(ByVal Dest As Long, _Source As EVENTMSG, _ByVal Length As Long)Public Declare Sub CopyMemoryH2T Lib "kernel32" Alias "RtlMoveMemory" (Dest As EVENTMSG, ByVal Source As Long, ByVal Length As Long)Public Declare Function UnhookWindowsHookEx Lib "user32" _(ByVal hHook As Long) As LongPublic Const WH_JOURNALPLAYBACK = 1Public Const WH_JOURNALRECORD = 0Public Const HC_SYSMODALOFF = 5Public Const HC_SYSMODALON = 4Public Const HC_SKIP = 2Public Const HC_GETNEXT = 1Public Const HC_ACTION = 0Public EventArr(1000) As EVENTMSGPublicEventLog As LongPublic PlayLog As LongPublic hHook As LongPublic hPlay As LongPublic recOK As LongPublic canPlay As LongPublic bDelay As BooleanPublic Function HookProc(ByVal iCode As Long, ByVal wParam As Long, _ByVal lParam As Long) As LongDim Result As LongrecOK = 1Result = 0If iCode < 0 Then 'iCode小于0必须直接调用下一个消息钩子函数Result = CallNextHookEx(hHook, iCode, wParam, lParam)ElseIf iCode = HC_SYSMODALON Then '不允许纪录recOK = 0ElseIf iCode = HC_SYSMODALOFF Then '允许纪录recOK = 1ElseIf ((recOK > 0) And (iCode = HC_ACTION)) Then'将消息纪录在纪录队列中CopyMemoryH2T EventArr(EventLog), lParam, Len(EventArr(EventLog)) EventLog = EventLog + 1If EventLog >= 1000 Then'当纪录大于1000后释放消息钩子UnhookWindowsHookEx hHookEnd IfEnd IfHookProc = ResultEnd FunctionPublic Function PlaybackProc(ByVal iCode As Long, ByVal wParam As Long, _ ByVal lParam As Long) As LongDim Result As LongcanPlay = 1Result = 0If iCode < 0 Then 'iCode小于0必须直接调用下一个消息钩子函数Result = CallNextHookEx(hPlay, iCode, wParam, lParam)ElseIf iCode = HC_SYSMODALON Then '不允许回放canPlay = 0ElseIf iCode = HC_SYSMODALOFF Then '允许回放canPlay = 1ElseIf ((canPlay = 1) And (iCode = HC_GETNEXT)) ThenIf bDelay ThenbDelay = FalseResult = 50End If'从纪录队列中取出消息并赋予lParam指针指向的EVENTMSG区域CopyMemoryT2H lParam, EventArr(PlayLog), Len(EventArr(EventLog))ElseIf ((canPlay = 1) And (iCode = HC_SKIP)) ThenbDelay = TruePlayLog = PlayLog + 1End IfIf PlayLog >= EventLog ThenUnhookWindowsHookEx hPlayEnd IfPlaybackProc = ResultEnd Function在Form1的代码窗口中加入以下代码:Option ExplicitPrivate Sub Command1_Click()EventLog = 0hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, _ App.hInstance, 0)Command2.Enabled = TrueCommand1.Enabled = FalseEnd SubPrivate Sub Command2_Click()UnhookWindowsHookEx hHookhHook = 0Command1.Enabled = TrueCommand2.Enabled = FalseCommand3.Enabled = TrueEnd SubPrivate Sub Command3_Click()PlayLog = 0hPlay = SetWindowsHookEx(WH_JOURNALPLAYBACK, AddressOf PlaybackProc, _App.hInstance, 0)Command3.Enabled = FalseEnd SubPrivate Sub Form_Load()Command1.Caption = "纪录"Command2.Caption = "停止"Command3.Caption = "回放"Command2.Enabled = FalseCommand3.Enabled = FalseEnd Sub运行程序,点击“纪录”按钮,然后在TextBox中输入一些文字或者在窗口上移动光标后再按“停止”键停止消息纪录,然后按“回放”按钮,可以看到刚才鼠标键盘的操作被丝毫不差的回放了出来。