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代表右键。
VB模拟鼠标键盘动作(转)2011-03-31 15:16来自网址:/share/detail/16221474VB模拟鼠标键盘动作有些时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。
那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。
当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。
如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。
当你按下一个键时,这个键的扫描码就被传给系统。
扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。
键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。
键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。
什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。
无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。
简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。
当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。
然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。
最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。
这个过程可以简单的如下表示:用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。
一、鼠标事件
Cilck:用户单击鼠标键时发生
DbLClick:用户双击鼠标键时发生
MouseDown:用户释放鼠标键时发生
MouseMove:移动鼠标时发生
二、键盘事件
KeyDown:在键按下时触发。
(可获得一个KeyCode值)
KeyUp:在键弹起时触发。
(可获得一个KeyCode值)
KeyPress:在键盘按下再弹起时发生。
(它可获得KeyAscii值)
注:
1、既然有了KeyDown和KeyUp,为什么还要KeyPress事件,我将键盘按下去后,到底是触发了KeyPress事件,还是KeyDown或KeyUp事件?答案是,当我们按了一下键盘后,这三种事件都触发。
2、一般而言,大多数程序并不关心KeyDown事件来确定按下的键,KeyPress事件在触发后,能够获得一个KeyAscii值。
它指键盘上的某个键与计算机ASCII码对应的值,如键“1”,KeyAscii为49;“A”,KeyAscii 为65;“Enter”,KeyAscii为13。
当我们在KeyPress事件中将KeyAscii 的值改为0后,就等于禁止键入。
3、然而并不是所有键盘上的键都有其KeyAscii值,有时,我们程序要判断用户是否按了功能键,可要区别数字小键盘和常规数字键时,那么KeyAscii就无能为力了。
此时可以考虑KEyDown和KeyUp事件,当用户击键后,它们能获得一个唯一的KeyCode值,从而判断用户到底按了键盘上的哪个键。
可以说,键盘上大多数键(Tab、PrintScreen键除外),都有唯一的KeyCode序列号。
常用的 ASCII 码表(0-127)。
VB模拟按键终极教程VB(Visual Basic)是一种可视化的编程语言,在Windows操作系统中得到广泛应用。
VB可以通过模拟按键实现自动化操作,比如自动填写表单、自动点击按钮等。
本教程将详细介绍如何使用VB来模拟按键操作的终极方法。
首先,我们需要创建一个新的VB项目。
打开VB开发环境,点击“新建项目”并选择“Windows桌面向导”。
在下一步中,选择“Windows窗体应用程序”并命名项目。
点击“确定”开始创建项目。
```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```上述代码声明了一个名为keybd_event的函数和一个名为KEYEVENTF_KEYUP的常量。
keybd_event函数用于模拟按键操作,KEYEVENTF_KEYUP常量用于指定按键的释放事件。
然后,在Form_Load事件处理程序中添加以下代码,实现模拟按键操作:```Private Sub Form_Loadkeybd_event(VBKeyLMenu, 0, 0, 0) '按下左Alt键keybd_event(Keys.F, 0, 0, 0) '按下F键keybd_event(Keys.F, 0, KEYEVENTF_KEYUP, 0) '释放F键keybd_event(VBKeyLMenu, 0, KEYEVENTF_KEYUP, 0) '释放左Alt键End Sub```上述代码会在窗体加载时模拟按下左Alt键和F键,并在F键释放后释放左Alt键。
最后,我们需要在按钮的Click事件处理程序中添加代码来触发模拟按键操作。
VB教程:序言-不再游戏我们需要什么我们需要什么?当我们在一个精彩的游戏世界中游历了一番之后,或是惊叹于某一工具软件的小巧精致之余,多少总会产生些许编程的冲动。
编程吗,在以前如果你对电脑还是一个门外汉,那实在是一件可望而不可及的事情。
如果运用基于DOS下的编程语言,譬如C、Qbasic、Pascal等等,真不知何年何月才能有所成就。
编程是需要天赋的,你必须在大脑中对整个程序有一个清晰的轮廓,一个高效的流程,这并不是每个人都能做到的,你必须思之慎之,这也使编程变成一件最枯燥无味的事情。
但在第四代计算机语言(可视化编程)出现后,可以确切的说它开发了人们的更多天赋,并不局限于那些头脑异常清晰的人,每一个人都可以发现自己也可以编出一些从前不敢问津的程序,想象力的充分发挥才是第四代语言的精粹。
Visual Basic(以下简称VB)可以说是可视化语言的先驱了,而且它也是可视化程度最高的一个,从几年前VB诞生之日起到现在,它已经经历了五个版本,而且现在微软正在紧张的进行着VB6.0的研制、测试,这么高的更新率,不外乎说明两个问题:用户对VB的热衷,微软对VB的重视。
不可否认微软对市场的预测能力是极为高明的,而它强大的技术、财力支持也使它在许多以前未进入的领域,在不长的时间内有成为最有力的竞争对手,如IE之于浏览器领域,《帝国时代》之于游戏都是最好的例证。
对于VB现在也有一个很强的竞争对手――Delphi,有人把它称作VB杀手,这显然有偏激之处,VB的确有它的不足之处,但Delphi又何尝不是呢,而且以微软对V B的倾心,VB的功能必然会越来越强大。
VB的诞生VB的出现可以说是Microsoft Windows的日渐成熟的必然产物。
Microsoft Windows为程序员和最终用户提供了一个共同的人机界面。
对用户,Windows提供了一个图形鼠标的操作环境,该环境对所有的应用程序都一样;对于程序员,Windows提供了一组预定义工具----称之为Microsoft Windows 的软件开发工具箱(SD K),该工具能使程序员建立一个与Windows界面相同的应用程序,而且,程序员不必关心最终用户的硬件配置情况。
看实例学VB6.0--使用右键菜单的例子2009年01月29日上午 02:55右键菜单能让软件的使用者快捷的完成操作,那么如何把右键菜单用在自己写的程序中呢?在这个小程序中我们能看到编辑并使用右键菜单的方法。
为了学习方便,提供的源码已经作了详细的中文注释,看看下面的代码:'------名称-------------作用------------' CmdCancel 退出按钮' mnublue “兰色”菜单项' mnured “红色”菜单项' RichTextBox1 文本框' PopupFrm 主窗体' mnufile 右键菜单的名字'--------------------------------------Private Sub CmdCancel_Click()Unload MeEnd Sub'当弹出式菜单的“红色”项被点击时Private Sub mnured_Click()'把RichTextBox框中的背景色设置为红色RichTextBox1.BackColor = vbRedEnd Sub'当弹出式菜单的“兰色”项被点击时Private Sub mnublue_Click()'把RichTextBox框中的背景色设置为兰色RichTextBox1.BackColor = vbBlueEnd Sub'当文本框上出现鼠标按下的事件时Private Sub RichTextBox1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)'MouseDown事件各种语法包含下列部分:'button 返回一个整数,用来标识该事件的产生是按下哪个按钮'其中左按钮(位 0),右按钮(位 2),以及中间按钮(位 4)'shift 返回一个整数,标示是否同时有Shift,Ctrl,Alt键按下'x, y 返回一个指定鼠标指针当前位置的数'Button = 2 表示右键按下If Button = 2 Then'PopupMenu方法用来弹出一个菜单'语法是 object.PopupMenu menuname, flags, X, Y'mnufile是我们在菜单编辑器中设计好的菜单'X,Y是弹出菜单的位置,可以为数字,如果直接写为X,Y则是在当前鼠标位置弹出菜单PopupFrm.PopupMenu mnufile, 0, X, YEnd IfEnd Sub我们先打开菜单编辑器(在工具菜单中),然后添加一个一级菜单Popmenu,将它的Visible属性设为“False”,这代表菜单在程序运行时是看不到的,由于一级菜单是二级菜单的上级菜单,所以二级菜单也是看不到的。
关于VB6.0中MSHFlexGrid控件实现鼠标滚动功能。
那位老师有更好的方案!VB6.0对列表类控件不支持鼠标中键滚动功能。
如果想实现这种功能就需要调用外部API函数来实现。
下面的代码是我现在解决此功能的一个方法。
虽然可以实现对数据表的滚动,可是效果太差,每次滚动的条数太多。
原理:当向下滚动鼠标中键时向窗体发送下一页(Page Down)的按钮命令。
当向上滚动鼠标中键时向窗体发送上一页(Page Up)的按钮命令。
那么这样的话每次滚动一次鼠标中键MSHFlexGrid控件内的数据就会翻一页,现在我想实现当鼠标中键滚动时MSHFlexGrid控件内的数据滚动5行(或者读取控制面板的设置滚动条数来控制滚动条数)。
'以下为模块代码'声明支持滚轮鼠标API---------------------------------Public Const GWL_WNDPROC = (-4)Public Const WM_COMMAND = &H111Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM_MOUSEWHEEL = &H20APublic Oldwinproc As LongPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndexAs Long) As Long'声明支持滚轮鼠标API---------------------------------Public Function FlexScroll(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long'支持滚轮的滚动Select Case wMsgCase WM_MOUSEWHEELSelect Case wParamCase -7864320 '向下滚SendKeys "{PGDN}"Case 7864320 '向上滚SendKeys "{PGUP}"End SelectEnd SelectFlexScroll = CallWindowProc(Oldwinproc, hwnd, wMsg, wParam, lParam)End Function'以下为窗体内的调用代码Private Sub MSHFlexGrid1_GotFocus()Oldwinproc = GetWindowLong(Me.hwnd, GWL_WNDPROC)SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf FlexScrollEnd SubPrivate Sub MSHFlexGrid1_LostFocus()SetWindowLong Me.hwnd, GWL_WNDPROC, OldwinprocEnd Sub以上为现在的解决方案。
实例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
参数给出)转化为对应的键值,这样,该语句就可以显示出被按键的信息。