看了网上关于以WinIO库模拟键盘事件的文章,便想把这种技巧用到鼠标事件上来。以前操作鼠标一直用SetCursorPos()控制光标位置,效率虽低,总算还可以忍受,但
模拟鼠标单击用的API是mouse_event(),其效率之低实在令人无法满意,而PostMessage()因为使用时需要提供句柄,又太不方便。偶得此方,仔细进行了论证和实验,发现效果十分理想。
有一些使用DirectX接口的程序,在读取鼠标操作时绕过了Windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,要求以最快速度响应鼠标输入。由于Windows消息是队列形式的,消息在传递时会有不少延迟,达不到游戏的要求。而DirectInput则绕过了Windows消息,直接与鼠标驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage()或者是mouse_event()都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写鼠标端口的方法来模拟硬件事件了。
在DOS时代,当用户按下或者放开一个键时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开windows的设备管理器,可以查看到键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口,用来发出控制信号。也就是,从&H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表示是按下键还是释放键。当按下键时,最高位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写入数据就可以模拟按键了!用过QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那我们先看看如果用QB该怎么写代码:
假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样
OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
OUT &H60,&H50 '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键
那么要释放这个键呢?像这样,发送该键的断码:
OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据
OUT &H60,(&H50 OR &H80) '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键
这篇文章使用WinIO来写入硬件端口,让我想起了从前的DOS时代,在那时,读写硬件端口何其方便。然而,我转而使用VB之后,在Windows下直接操作底层端口变成了美好的回忆(当然,也因为很少有必要)。
废话少说,查阅资料得知,要操作鼠标缓冲区,须先向0x64端口写入KBC指令0xD3,表示要写入,再向0x64写入扫描码。扫描码0x09代表鼠标左键按下,0x08代表鼠标左键放开。写代码如下:
'====================声明部分====================
Private Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean
Private Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean
Private Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean
Private Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean
'================================================
Private Sub Form_Load()
If InitializeWinIo = False Then
'用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false
MsgBox "驱动程序加载失败!"
Unload Me
End If
Timer1.Interval = 3000
Timer1.Enabled = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
ShutdownWinIo '程序结束时用ShutdownWinIo函数卸载驱动程序
End Sub
Private Sub Timer1_Timer()
ClickMouse
End Sub
Private Sub ClickMouse()
SetKey &HD3, &H9
SetKey &HD3, &H0
SetKey &HD3, &H0
SetKey &HD3, &H8
SetKey &HD3, &H0
SetKey &HD3, &H0
End Sub
Private Sub SetKey(Typ, ScanCode)
KBCWait4IBE ‘根据KBC规范,在向键盘端口写入数据前要等待一段时间
SetPortVal &H64, Typ, 1 '写入KBC指令
KBCWait4IBE
SetPortVal &H60, ScanCode, 1 '写入扫描码
End Sub
Private Sub KBCWait4IBE() '等待缓冲区为空
Dim dwVal As Long
Do
GetPortVal &H64, dwVal, 1
'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中
'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度
Loop While (dwVal And &H2)
End Sub
该程序为实验所用,仅作实例,在WinXP Home Edition,VB6下测试通过。
分享到:
相关推荐
"WinRing0驱动级模拟鼠标按键易语言模块"是专为Windows系统设计的一个软件开发工具,主要用于帮助程序员以易语言编写程序时,实现对鼠标的驱动级模拟按键功能。 易语言是一种中国本土研发的、以中文编程为特色的...
对于鼠标操作,可以模拟鼠标移动、左键点击、右键点击等行为。 标签“源码软件”表明压缩包中包含了源代码,这意味着用户可以查看和学习程序的实现细节,甚至可以根据自己的需求进行修改。而“winio”标签则进一步...
在VB(Visual Basic)编程环境中,我们可以创建一个鼠标连点器的应用程序,它允许用户模拟鼠标点击,例如左键或右键的连续点击,并且能够自定义点击间隔时间。这样的工具在某些游戏或者自动化任务中可能非常有用。...
【VB鼠标模拟点击器实时坐标获取】是一种基于Visual Basic(VB)编程语言开发的应用程序,其主要功能是模拟鼠标左键点击,并能实时获取鼠标的当前位置坐标。在IT领域,这样的工具可以被用来自动化一些重复性的鼠标...
3. **API调用**:在VB中实现鼠标点击,通常需要调用Windows API(应用程序接口),如SetCursorPos函数用于设置鼠标位置,mouse_event函数用于模拟鼠标事件。 4. **多点触控支持**:对于支持多点触控的设备,鼠标...
1. **鼠标事件处理**:在VB或VB.NET中,我们可以使用`MouseClick`或`MouseDown`、`MouseUp`事件来模拟鼠标点击。通过编程设置点击位置和类型(左键、右键),可以实现自动点击的功能。 2. **定时器控件(Timer)**...
例如,`SendKeys`方法用于模拟键盘输入,而`SetCursorPos`和`mouse_event` API函数则用于模拟鼠标移动和点击。这些功能在自动化测试、游戏外挂或者某些特殊应用中非常常见。但要注意,不正当使用可能触犯法律,应...
通过阅读《vb大漠找字以及后台鼠标点击详解.txt》文件,你应该能深入理解这些知识点,并掌握如何在VB2008环境中运用大漠插件进行实际操作。不断实践和学习,你将能够熟练掌握VB与大漠插件的结合,提升你的编程能力。
3. **模拟鼠标点击**: 要实现模拟点击,我们需要调用WinAPI中的`mouse_event`函数。该函数可以模拟鼠标的移动、单击、双击等操作。参数包括鼠标事件类型、相对X坐标、相对Y坐标、鼠标按键状态和额外信息。 4. **...
在这个特定的场景中,VB被用来实现一个鼠标自动点击器,这是一款工具,它可以模拟鼠标的点击动作,帮助用户自动化某些重复性的任务,例如在购物网站上进行秒杀活动。 秒杀是一种促销策略,商家会在某一特定时间提供...
VB6使用事件驱动编程,当用户执行特定操作(如点击按钮或滚动鼠标)时,相应的事件会被触发。在VB6控件中,没有直接的MouseWheel事件,但我们可以通过处理WM_MOUSEWHEEL消息来实现类似的功能。WM_MOUSEWHEEL是...
vb6 编写代码时,翻动窗口比较麻烦,,安装驱动后支持鼠标滚轮,方便得很!!!
【VB鼠标连点器】是一款基于Visual Basic(VB)编程语言开发的实用工具,它的主要功能是模拟鼠标的连续点击动作,从而实现自动化操作,帮助用户省去长时间手动点击的繁琐工作。这款软件尤其适用于需要频繁点击的游戏...
4. **模拟点击**:VB提供了API函数来模拟鼠标点击,例如`SendInput`函数,可以模拟鼠标按下和释放的动作,从而实现自动点击。 5. **循环与控制逻辑**:为了让鼠标点击器连续工作,程序可能包含一个循环结构,不断地...
VB 模拟鼠标键盘动作有多种方法,下面将介绍四种典型的方法: 1. 局部级模拟:通过伪造键盘消息来模拟键盘操作。Windows 提供了多个 API 函数来实现直接向目标程序发送消息的功能,常用的有 SendMessage 和 Post...
5. 鼠标键盘事件模拟:学习如何通过代码模拟鼠标点击、移动和键盘按键,以及处理各种输入事件。 通过这个控件,开发者可以更高效、便捷地实现自动化操作,使得VB程序的功能更加丰富和灵活。对于初学者,这是一个很...
总结来说,这个VB6程序设计用于模拟鼠标点击,帮助用户自动化重复性的电脑操作。它包括了记录和播放鼠标动作的功能,可能还支持热键启动和自定义操作。开发者使用了模块化编程来组织代码,同时创建了多个窗体以提供...
VB使用事件驱动编程模型,这意味着用户界面的每一个操作(如点击按钮)都会触发相应的代码执行。在这个电子琴程序中,可能有多个控件(如按钮或图形区域)代表不同的音符,当用户点击这些控件时,VB会播放对应的音效...
VB 模拟按键终极教程 VB 模拟按键终极教程是指使用 Visual Basic 语言来模拟键盘操作的过程。在本教程中,我们将了解 Windows 中响应键盘事件的机制,并学习如何使用 VB 来编写程序,达到与按键精灵类似的功能。 ...