VB实例6 追踪鼠标和按键
- 格式:doc
- 大小:39.00 KB
- 文档页数:2
第四章按钮(一)从本章开始我们将正式进入VB的编程世界,但这还仅仅是个开端,要编出功能强大的软件,还要学很多东西,那就要看以后的VB高级教程了,我也得努力学啊!按钮是我们在Windows操作见到最多的控件,它们有着各种各样的功能:“确认”、“取消”、“下一步”等等,这些都是按钮的表现,另外还有很多图形话的按钮,其实它们并没什么不同,所有的按钮都是通过单击(click)事件实现的,只不过是在外表不同罢了。
下面就让我们建立一个最简单的按钮,双击工具箱的CommandButton,将在窗体上建立一个形如图4-1的按钮,它的缺省名(Name属性)为Command1,我们可以把它改名为cmdExit,把Caption 属性设为“退出”,然后双击,按钮填写代码:Private Sub cmdExit_Click()Unload MeEnd Sub按下F5或者工具条上的播放按钮,运行程序。
图4-2当你按下退出按钮的时候,就会自动退出程序,原因是当你单击按钮时激活了它的Click事件,执行“Unload Me”语句,使得窗体被卸载。
上面举了一个比较简单的例子,下面的例子稍微复杂些:新建窗体,控件布局如图4-3所示,包括一个List控件,一个Text控件和两个按钮(Command1和Command2),(比较简单的程序我们都采用缺省名),对它们属性做如下修改:把使用Button1的Enabled属性设为False(假),是使程序在初始时,无法单击Command1。
按F5,运行程序,图4-4,复原按钮成为灰色,不可选。
当然现在程序还什么也不能做,下面我们在程序中添加代码:首先在General里声明全局变量:Dim StoreString As String '用来储存字符串※注意:为什么用全局变量?VB里每一个小过程都相当于一个程序,程序里的变量称为局部变量,是只能在程序内部使用的,而当程序调用结束后,由于从内存中被清除,所以变量储存的值也就消失了,这里的全局变量是用来在过程中传递字符串。
VB编程中的键盘和鼠标知识总结!大家好,今天我们来学习VB编程中的键盘与鼠标知识。
读书改变命运,这个理论在当今社会仍然适用。
并且越喜欢读书学习的人,越有更多机会去选择自己想要的生活。
不要惧怕读书的苦,这是你通向美好未来最好的路,共同努力!VB中的键盘与鼠标事件KeyPress事件KeyPress事件简介在窗体上画一个控件(指可以发生KeyPress事件的控件),并双击该控件,进入程序代码窗口后,从'过程'框中选取KeyPress,即可定义KeyPress事件过程。
一般格式为:Private Sub Text1_KeyPress(KeyAscii As Integer)'用户按下并释放一个能产生ASCII码的键时被触发End SubKeyPress事件带有一个参数,这个参数有两种形式:第1种形式是Index As Integer,只用于控件数组;第2种形式是KeyAscii As Integer,用于单个控件。
KeyDown和KeyUp事件KeyDown和KeyUp事件简介KeyDown和KeyUp事件的参数也有两种形式,其中Index As Integer只用于控件数组,而KeyCode As Integer,Shift As Integer用于单个控件。
KeyDown和KeyUp事件都有两个参数,即KeyCode和Shift。
①KeyCode是按键的实际ASCII码。
该码以'键'为准,而不是以'字符'为准。
②Shift转换键。
它指的是3个转换键的状态,包括Shift,Ctrl和Alt键,这3个键分别以二进制数形式表示,每个键有3位,即Shift 键为001,Ctrl键为010,Alt键为100。
Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer)'用户按下任一个键时被触发End SubPrivate Sub Command1_KeyUp(KeyCode As Integer, Shift As Integer)'用户释放任一个键时被触发End Sub鼠标事件鼠标事件简介为了实现鼠标操作,Visual Basic中提供了以下3个事件过程。
12.1.1鼠标事件过程M o u s e M o v e、M o u s e D o w n、M o u s e U p三个事件的过程的语法格式如下:S u b O b j e c t_M o u s e M o v e(B u t t o n A s I n t e g e r,S h i f t A s I n t e g e r,_X A s S i n g l e,Y A s S i n g l e)S u b O b j e c t _M o u s e D o w n(B u t t o n A s I n t e g e r,S h i f t A s I n t e g e r,_X A s S i n g l e,Y A s S i n g l e)S u b O b j e c t_M o u s e U p(B u t t o n A s I n t e g e r,S h i f t A s I n t e g e r,_X A sS i n g l e,Y A s S i n g l e)其中:◆O b j e c t是可选的一个对象表达式,可以是窗体对象和大多数可视控件。
◆B u t t o n参数是表示按下或松开鼠标哪个按钮。
图12-1表示了参数B u t t o n的值。
图12-1参数B u t t o n值参数B u t t o n的值对应的功能如表12-1所示。
表12-1参数B u t t o n的说明参数(B u t t o n)值说明v b L e f t B u t t o n1左按钮被按下v b R i g h t B u t t o n2右按钮被按下v b M i d d l e B u t t o n4中间按钮被按下◆通过S h i f t参数表示在B u t t o n参数指定的按钮被按下或者被松开的情况下键盘的S h i f t、C t r l和A l t键的状态,图12-2表示了S h i f t参数的值,C t r l、S h i f t、A l t三键组合使用情况如表12-2所示。
VB: È«¾Ö¼üÅÌ¡¢Êó±ê¹³×Ó'---------------------------------'Form'°²×°¹³×ÓPrivate sub AddHook()'¼üÅ̹³×ÓlHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0)'Êó±ê¹³×ÓlHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)End Sub'ж¹³×ÓPrivate sub DelHook()UnhookWindowsHookEx lHook(0)UnhookWindowsHookEx lHook(1)End Sub'---------------------------------'Ä£¿é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 LongPublic Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongPublic Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As IntegerPublic Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)Public Type KEYMSGSvKey As Long 'ÐéÄâÂë (and &HFF)sKey As Long 'ɨÃèÂëflag As Long '¼ü°´Ï£º128 ̧Æð£º0time As Long 'WindowÔËÐÐʱ¼äEnd TypePublic Type MOUSEMSGSX As Long 'x×ù±êY As Long 'y×ù±êa As Longb As Longtime As Long 'WindowÔËÐÐʱ¼äEnd TypePublic Type POINTAPIX As LongY As LongEnd TypePublic Const WH_KEYBOARD_LL = 13Public Const WH_MOUSE_LL = 14Public Const Alt_Down = &H20'-----------------------------------------'ÏûÏ¢Public Const HC_ACTION = 0Public Const HC_SYSMODALOFF = 5Public Const HC_SYSMODALON = 4'¼üÅÌÏûÏ¢Public Const WM_KEYDOWN = &H100Public Const WM_KEYUP = &H101Public Const WM_SYSKEYDOWN = &H104Public Const WM_SYSKEYUP = &H105'Êó±êÏûÏ¢Public Const WM_MOUSEMOVE = &H200Public Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_LBUTTONDBLCLK = &H203Public Const WM_RBUTTONDOWN = &H204Public Const WM_RBUTTONUP = &H205Public Const WM_RBUTTONDBLCLK = &H206Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM_MBUTTONDBLCLK = &H209Public Const WM_MOUSEACTIVATE = &H21Public Const WM_MOUSEFIRST = &H200Public Const WM_MOUSELAST = &H209Public Const WM_MOUSEWHEEL = &H20APublic Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As LongPublic strKeyName As String * 255Public Declare Function GetActiveWindow Lib "user32" () As LongPublic keyMsg As KEYMSGSPublic MouseMsg As MOUSEMSGSPublic lHook(1) As Long'----------------------------------------'Ä£ÄâÊó±êPrivate Const MOUSEEVENTF_LEFTDOWN = &H2Private Const MOUSEEVENTF_LEFTUP = &H4Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute movePrivate Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long,ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByValdwExtraInfo As Long)Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd AsLong, lpPoint As POINTAPI) As Long'--------------------------------------'Ä£Äâ°´¼üPrivate Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByValbScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)'Êó±ê¹³×ÓPublic Function CallMouseHookProc(ByVal code As Long, ByVal wParam AsLong, ByVal lParam As Long) As LongDim pt As POINTAPIIf code = HC_ACTION ThenCopyMemory MouseMsg, lParam, LenB(MouseMsg)Form1.txtMsg(1).Text = "X=" + Str(MouseMsg.X) + " Y=" +Str(MouseMsg.Y)Form1.txtHwnd(1) = Format(wParam, "0")If wParam = WM_MBUTTONDOWN Then '°ÑÖмü¸ÄΪ×ó¼ümouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0CallMouseHookProc = 1End IfIf wParam = WM_MBUTTONUP Thenmouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0CallMouseHookProc = 1End IfEnd IfIf code <> 0 ThenCallMouseHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function'¼üÅ̹³×ÓPublic Function CallKeyHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As LongDim lKey As LongDim strKeyName As String * 255Dim strLen As LongIf code = HC_ACTION ThenCopyMemory keyMsg, lParam, LenB(keyMsg)Select Case wParamCase WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP, WM_KEYUP:lKey = keyMsg.sKey And &HFF 'ɨÃèÂëlKey = lKey * 65536strLen = GetKeyNameText(lKey, strKeyName, 250)Form1.txtMsg(0).Text = "¼üÃû:" + Left(strKeyName, strLen) + " ÐéÄâÂë:" + Format(keyMsg.vKey And &HFF, "0") + " ɨÃèÂë:" + Format(lKey / 65536, "0")Form1.txtHwnd(0) = ""If (GetKeyState(vbKeyControl) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Ctrl "End IfIf (keyMsg.flag And Alt_Down) <> 0 ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Alt "End IfIf (GetKeyState(vbKeyShift) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Shift"End If'keyMsg.vKey And &HFF ÐéÄâÂë'lKey / 65536 ɨÃèÂëIf (keyMsg.vKey And &HFF) = vbKeyY Then '°ÑY¼üÌæ»»ÎªN If wParam = WM_SYSKEYDOWN Or wParam = WM_KEYDOWN Thenkeybd_event vbKeyN, 0, 0, 0End IfCallKeyHookProc = 1 'ÆÁ±Î°´¼üEnd IfEnd SelectEnd IfIf code <> 0 ThenCallKeyHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function================================================================== =。
收稿日期:2001-06-26基金项目:上饶师范学院科研基金资助项目VB 中的鼠标处理技术!谭国律(上饶师范学院数学计算机系,江西上饶334001)摘要:详细论述了VB 系统中的鼠标事件,以及在使用方法中的技术细节和技巧,介绍了利用API 进行鼠标控制的方法,并给出了具体的应用示例程序。
关键词:VB ;鼠标事件;事件代码;API 中图法分类号:TP334.2文献标识码:B 文章编号:1001-3695(2002)04-0156-031概述鼠标是计算机基本的输入设备之一,特别在当今图形化操作界面下,没有鼠标将是极不方便的。
进行鼠标各种操作的处理是软件开发中要考虑的基本因素之一,也是软件的基本功能。
在VB6.0中,主要是通过鼠标事件代码来响应用户的操作,VB 系统为对象(控件)主要提供了五种鼠标事件:MOuseDOWD 事件、MOuse-up 事件、MOuseMOVe 事件、Ciick 事件和DbiCiick 事件。
这些事件不仅提供了响应鼠标的操作方法,而且还提供了利用鼠标进行信息输入、处理的手段以及在窗口和菜单中移动、选择的基本形式。
VB 系统提供的五个鼠标事件是:MOuseDOWD 事件当用户按下鼠标键时,触发该事件MOuseup 事件当用户释放鼠标键时,触发该事件MOuseMOVe 事件当用户移动(拖动)鼠标时,触发该事件Ciick 事件当用户单击鼠标键时,触发该事件DbiCiick 事件当用户双击鼠标键时,触发该事件2VB 鼠标事件使用方法2.1Mousedown 事件当在某个控件上按下鼠标键时触发该控件的MOuseDOWD 事件。
通常,鼠标具有左、右两个按键。
MOuseDOWD 事件用来响应用户鼠标按键以及对控制键Shift ,Ctri 和Ait 键按下情况,其用法具有如下形式:PriVate Sub FOrm MOuseDOWD (ButtOD As IDteger ,Shift As IDteger ,X AsSiDgie ,Y As SiDgie )参数ButtOD 记录用户鼠标按键的整型数值,其中1代表左键,2代表右键。
实例6 追踪鼠标和按键
“追踪鼠标和按键”程序运行后,当鼠标指针在窗口中移动时,会在窗口中
实时显示鼠标的当前位置;当键盘上的某个按键被按下时,将在窗口中显示该按
键的信息:当鼠标双击窗口时,会在窗口中显示出相关的信息。
1.创建程序界面
创建一个“标准EXE”‘工程,设置窗体From1的Caption属性为“按键鼠
标”,Font属性为隶书、四号、粗体,ForeColor属性为蓝色。
2.程序代码编辑
在窗体的“代码”窗口中输入以下代码。
Private Sub Form_DblClick()
Me.Cls '清除窗口显示的文字
Print '打印一个空行
Print "鼠标双击窗体" '在窗体中显示文字"鼠标双击窗体"
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
Me.Cls
Print
Print "键盘上的"; Chr$(KeyAscii); "键被按下" '在窗体上显示键盘按
键信息
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
Me.Cls
Print
Print "鼠标当前坐标是:"; X; ","; Y '在窗体上显示鼠标位置
End Sub
程序中的关键字 Me代表了程序所在的窗体,“Me.Cls”即表示清除当前窗
体上所显示的文字。
Print办法用于在窗体中显示文字或者数据,当Print后边没有参数时,表
示打印一个空行,以用于换行等用途。当需要在同一行中打印多个数据时,可以
用分号“;”将各个参数区分开,例如:本程序中的“Print”鼠标当前坐标
是:”;X;”,”:Y”语句。
程序中使用到了窗体的MouseMove事件和KeyPress事件。
MouseMove事件的事件过程头格式如下:
Private Sub Object_MouseMove(Button As Integer, Shift As Integer. X
As Single. Y As Single)其中的Object代表响应该事件的对象,本例中即为
Form1窗体,参数Button表示被按下的鼠标按键,其值为一个整数,当Button
为0时表示鼠标左键被按下,当Button为1时表示鼠标右键被按下,当Button
为2时表示鼠标中间按键被按下。
参数Shift代表被按下的键盘控制键,也是用一个整数来表示。当Shift
键被按下时值为0,当Ctrl键被按下时值为1,当Alt键被按下时值为2。
参数X和Y表示鼠标指针在窗体的当前位置。Print "鼠标当前坐标是:"; X;
","; Y,语句中的X和Y就是来源于MouseMove事件中的参数。
在程序运行期间,若有键盘按键发生时,就会产生KeyPress事件。
语句“Print "键盘上的";Chr$(KeyAscii); "键被按下"”中的Chr$()是
一个VB函数,该函数用于将合法的ASCII码值(由KeyPress事件中的KeyAscii
参数给出)转化为对应的键值,这样,该语句就可以显示出被按键的信息。