VB模拟鼠标键盘动作

合集下载

如何用vb实现模拟鼠标中键滚动

如何用vb实现模拟鼠标中键滚动

如何用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模拟鼠标键盘

VB模拟鼠标键盘
点击vb辅助器里的模拟鼠标键盘区在模拟键盘区的第一个文本框中填上ad每个字母隔一个空格
1.下载VB辅助器,可在游迅网搜索下载,下载完成后解压并打开辅助器。
2.新建一个VB工程,将解压文件里的模块添加到工程,并添加1个按钮控件
3.点击VB辅助器里的模拟பைடு நூலகம்标键盘区,在模拟键盘区的第一个文本框中填上A B C D,每个字母隔一个空格。
4.点击复制,在VB按钮被左键单击事件中粘贴上去。
5.将输入法切换为中文,查看效果
6.模拟鼠标点击只需填上点击的位置,选择按键和次数
7.点击复制,粘贴到VB按钮被左键单击事件中查看效果。

利用VB建立鼠标键盘操作回放

利用VB建立鼠标键盘操作回放

利用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类型,前者获得鼠标、键盘动作消息,后者回放鼠标键盘消息。

VB程序设计课件第17讲 鼠标、键盘

VB程序设计课件第17讲 鼠标、键盘
注意: 注意:鼠标事件可发生在窗体或控件上 事件: MouseDown 事件:按下某一鼠标键
Sub Form1_MouseDown(Sender As Object, e As ……)…… MouseUp: MouseUp:释放某一鼠标键 MouseMove: MouseMove:移动鼠标
2
对象 e
3
• e.X 和 e.Y :
鼠标的当前位置
例 显示鼠标指针所指位置
4
2. 键盘事件
Form1_KeyPress(Sender As Object, e As ……) e.KeyChar:按键的ASCII码 e.KeyChar:按键的ASCII码 ASCII e.Handled: e.Handled:是否响应本次按键操作 True: True:不响应 例:文本框的输入效应 False: False:响应
6
False: False:响应
区别
KeyPress 事件发生的时间 参数值 按Shift+A时 Shift+A时 事件发生的次数 按Shift+A时参数 Shift+A时参数 键盘大写状态) (键盘大写状态) 按Shift+a时参数 Shift+a时参数 键盘小写状态) (键盘小写状态) 按一ASCII键 按一ASCII键 ASCII e.KeyChar接收到 e.KeyChar接收到 ASCII值 ASCII值 事件发生一次 97 65 KeyDown和 KeyDown和KeyUp 按任意一个键 e.KeyCode接收到 e.KeyCode接收到 键的扫描码 事件发生两次 第一次是16 第一次是16 第二次是65 第二次是65 第一次是16 第一次是16 第二次是65 第二次是65
e.Button 操作左键 操作右键 操作中键 没按键 MouseButtons.Left MouseButtons.Right MouseButtons.Middle MouseButtons.None

VB模拟鼠标移动和单击

VB模拟鼠标移动和单击

VB模拟⿏标移动和单击VB模拟⿏标移动和单击这⾥要⽤到SetCursorPos(指定⿏标坐标)和mouse_event(综合⿏标击键和⿏标动作)两个API函数。

例:单击Command1时⿏标会到(500,500)这个点作⿏标左键单击动作。

Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongPrivate Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)Private Const MOUSEEVENTF_LEFTDOWN = &H2Private Const MOUSEEVENTF_LEFTUP = &H4Private Sub Command1_Click()SetCursorPos 500, 500mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0End Sub关于Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)参数:dwFlags:标志位集,指定点击按钮和⿏标动作的多种情况。

VB程序设计键盘与鼠标事件过程

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
Function MouseClick(x, y, button)
' 模拟鼠标点击
' x: 鼠标点击的横坐标
' y: 鼠标点击的纵坐标
' button: 鼠标按钮(0: 左键,1: 右键,2: 中键)
Call MoveTo x, y
Call LeftClick
If button = 1 Then ' 右键
Call RightClick
ElseIf button = 2 Then ' 中键
Call MiddleClick
End If
End Function
Function KeyInput(key)
' 模拟键盘输入
' key: 要输入的字符或键位码
Call KeyDown key
Call KeyUp key
End Function
```
以上两个函数分别用于模拟鼠标点击和键盘输入,具体用法如下: ```vb
' 模拟鼠标左键点击(100, 200)
Call MouseClick(100, 200, 0)
' 模拟键盘输入'Hello, World!'
Call KeyInput 'Hello, World!'
```
通过封装这些常用的操作,我们可以使代码更加简洁、易读,同时也方便了代码的复用和维护。

VB模拟鼠标操作

VB模拟鼠标操作

模拟鼠标操作全局级模拟GetCursorPos/GetCursorPos两个重要函数,获取光标位置与设置光标位置,详细说明请参考本站另一篇文章-经典API函数。

mouse_event模拟鼠标操作的主函数。

涉及API函数列表:Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As LongPrivate Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As LongPrivate Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpstring As String, ByVal cch As Long) As LongPrivate Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPrivate Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPrivate Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Type POINTAPIx As Longy As LongEnd TypeDim lpPoint As POINTAPI,sp as LongSub leftdown() '左键单击Dim lpstr As Stringlpstr = Space(255)GetCursorPos lpPointsp = WindowFromPoint(lpPoint.x, lpPoint.y)GetWindowText sp, lpstr, 255ShowWindow sp, SW_NORMALOn Error Resume NextAppActivate RTrim(lpstr)mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0End Sub先来看这个封装的leftdown()过程:第一句,声明一个字符串型变量;第二句,预置缓冲区为255个空字符,因为下面的函数需要将窗口标题字符串放入该缓冲区;第三句,获得光标当前位置,该位置信息被置入POINTAPI型变量lpPoint中,这是一个结构体,其中两个成员变量x,y分别为光标的横坐标,纵坐标;第四句,WindowFromPoint()函数返回光标下目标的句柄,赋给Long型变量sp,很有用的一个函数;第五句,ShowWindow()函数,显示一个窗口,其参数分别为目标窗口的句柄(第四句已获得)和显示样式,常用函数;第六句,容错,因为操作系统运行的不确定性,加容错语句以防万一;第七句,AppActivate()函数,激活一个窗口为活动窗口,其参数为窗口标题字符串(第四句已获得),刚才缓冲区被置了很大,所以需要去串的右端空格;第八句和第九句,关键所在,mouse_event()函数,左键单击只需设置第一个参数,其它参数用途请参考MSDN。

模拟鼠标的操作方法

模拟鼠标的操作方法

模拟鼠标的操作方法
模拟鼠标的操作方法通常可以使用编程语言提供的相关函数或库来实现。

下面是一些常见的操作方法:
1. 鼠标移动:可以使用`MouseMove`函数来模拟鼠标的移动操作。

该函数接受两个参数,分别是鼠标移动到的目标位置的横坐标和纵坐标。

例如,
`MouseMove(x, y)`可以将鼠标移动到坐标为(x, y)的位置。

2. 鼠标点击:可以使用`MouseClick`函数来模拟鼠标的点击操作。

该函数接受一个参数,表示点击的按钮。

例如,`MouseClick("left")`表示模拟鼠标左键的点击操作。

3. 鼠标双击:可以使用`MouseDoubleClick`函数来模拟鼠标的双击操作。

该函数接受一个参数,表示双击的按钮。

例如,`MouseDoubleClick("left")`表示模拟鼠标左键的双击操作。

4. 鼠标拖动:可以使用`MouseDown`、`MouseMove`和`MouseUp`等函数来模拟鼠标的拖动操作。

首先使用`MouseDown`函数按下鼠标按钮,然后使用`MouseMove`函数移动鼠标到目标位置,最后使用`MouseUp`函数释放鼠标按钮。

例如,`MouseDown("left")`、`MouseMove(x, y)`和`MouseUp("left")`可以模拟鼠标左键的拖动操作。

需要注意的是,具体的操作方法可能因编程语言和操作系统的不同而有所差异。

VB模拟按键终极教程

VB模拟按键终极教程

VB模擬按鍵終極教程`有了它`啥游戏都不怕全局級模擬你會發現,用上面的方法類比按鍵並不是對所有程式都有效的,有的程式啊,你向它發了一大堆消息,可是它卻一點反應也沒有。

這是怎麼回事呢?這就要看具體的情況了,有些程式(特別是一些遊戲)出於某些原因,會禁止用戶對它使用類比按鍵程式,這個怎麼實現呢?比如可以在程式中檢查一下,如果發現自己不是活動視窗,就不接受鍵盤消息。

或者仔細檢查一下收到的鍵盤消息,你會發現真實的按鍵和類比的按鍵消息總是有一些小差別,從這些小差別上,目的程式就能判斷出:這是假的!是偽造的!!因此,如果用PostMessage發送局部消息類比按鍵不成功的話,你可以試一試全局級的鍵盤消息,看看能不能騙過目的程式。

類比全局鍵盤消息常見的可以有以下一些方法:(1) 用API函數keybd_event,這個函數可以用來類比一個鍵盤事件,它的VB聲明為:Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags A s Long, ByVal dwExtraInfo As Long)參數bVk表示要類比的按鍵的虛擬碼,bScan表示該按鍵的掃描碼(一般可以傳0),dwFlags表示是按下鍵還是釋放鍵(按下鍵為0,釋放鍵為2),dwExtraInfo是擴展標誌,一般沒有用。

比如要模擬按下A鍵,可以這樣:Const KEYEVENTF_KEYUP = &H2keybd_event VK_A, 0, 0, 0'按下A鍵keybd_event VK_A, 0, KEYEVENTF_KEYUP, 0'釋放A鍵注意有時候按鍵的速度不要太快,否則會出問題,可以用API函數Sleep來進行延時,聲明如下:Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)參數dwMilliseconds表示延時的時間,以毫秒為單位。

VB模拟鼠标键盘动作(转)

VB模拟鼠标键盘动作(转)

VB模拟鼠标键盘动作(转)2011-03-31 15:16来自网址:/share/detail/16221474VB模拟鼠标键盘动作有些时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。

那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。

当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。

如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。

当你按下一个键时,这个键的扫描码就被传给系统。

扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。

键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。

键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。

什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。

无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。

简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。

当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。

然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。

最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。

这个过程可以简单的如下表示:用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。

VB鼠标的API函数使用详解

VB鼠标的API函数使用详解

VB鼠标的API函数使用详解1. MouseDown(Button, Shift, X, Y)该函数用于模拟鼠标按下按钮的动作,Button参数可以是常量vbLeftButton、vbRightButton或vbMiddleButton,用于指示要模拟按下的鼠标键;Shift参数可以是常量vbShiftMask、vbCtrlMask或vbAltMask,表示按下Shift、Ctrl、Alt键的状态,如果Shift参数没有指定,则默认为不按下Shift、Ctrl、Alt键;X参数表示鼠标按下点的横坐标,Y参数表示鼠标按下点的纵坐标。

2. MouseUp(Button, Shift, X, Y)该函数用于模拟鼠标抬起按钮的动作,Button参数可以是常量vbLeftButton、vbRightButton或vbMiddleButton,用于指示要模拟抬起的鼠标键;Shift参数可以是常量vbShiftMask、vbCtrlMask或vbAltMask,表示抬起Shift、Ctrl、Alt键的状态,如果Shift参数没有指定,则默认为不抬起Shift、Ctrl、Alt键;X参数表示鼠标抬起点的横坐标,Y参数表示鼠标抬起点的纵坐标。

3. MouseMove(X, Y)该函数用于模拟鼠标移动的动作,X参数表示鼠标移动目标点的横坐标,Y参数表示鼠标移动目标点的纵坐标。

4. MouseWheel(WheelClicks)该函数用于模拟鼠标滚轮操作,WheelClicks参数表示要模拟的滚轮点击数,每次滚轮转动一次,WheelClicks参数的值就会增加或减少一;如果是向前滚动,则WheelClicks参数值应该大于0;如果是向后滚动,则WheelClicks参数值应该小于0。

5. DragPicture(Picture, X1, Y1, X2, Y2, Mode)该函数用于拖拽图形,Picture参数表示拖拽对象。

计算机应用基础VB程序设计第3讲键盘和鼠标操作及菜单设计

计算机应用基础VB程序设计第3讲键盘和鼠标操作及菜单设计

可以捕捉击键动作 例2:编写模拟打字机的过程。

Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Label1.Text = "" End Sub Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress Label1.Text = Label1.Text & e.KeyChar End Sub

KeyPress、KeyDown、KeyUp 事件
3
键盘操作_续1

KeyPress事件

当用户按下并释放一个某个字符键时触发KeyPress事件 KeyPress事件过程的格式:
Private Sub <对象名>_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyPress … End Sub
10
鼠标操作_续2_举例

例4利用鼠标随手绘图。要求当按鼠标左键拖动时随手画线, 当按右键拖动并释放画圆。程序运行的界面如图所示。

程序
Dim centerx%, centery%, d% „所绘圆的圆心坐标和半径 Dim startx%, starty% „绘制直线时每一个小线段的起始点坐标 Dim mpaint As Graphics „创建Graphics对象 Dim mp As New Pen(Color.Blue, 2) Private Sub Form7_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.Font = New Font("", 14, FontStyle.Bold) mpaint = Me.CreateGraphics „初始化Graphics对象mpaint为窗体 End Sub

VB模拟按键终极教程

VB模拟按键终极教程
如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam 和lParam 这两个参数。在一个键盘消息中,wParam 参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam 参数的值就设为VK_A ,至于lParam 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细了解一下lParam 吧。lParam 是一个long类型的参数,它在内存中占4个字节,写成二进制就是00000000 00000000 00000000 00000000 一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还是释放键。大家一般习惯写成16进制的,那么就应该是&H00 00 00 00 ,第0-15位一般为&H0001,如果是按下键,那么24-31位为&H00,释放键则为&HC0,那么16-23位的扫描码怎么会得呢?这需要用到一个API函数MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。它的VB声明如下:
MakeKeyLparam = Val("&H" & s)
End Function
这个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) ,很简单吧。值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。

VB程序中实现鼠标

VB程序中实现鼠标

在VB程序中实现鼠标右键双击西北工业大学(710072) 况正谦在Microsoft Visual BASIC(VB)中,窗体(Form)和控件(Control)等对象的单击(Click)和双击(Double-Click)事件都是指鼠标左键而言的。

鼠标右键的单击和双击事件在VB中没有对应的事件驱动过程去响应和处理。

但是在实际应用中(特别是一些可视化的图形软件)可能对鼠标键的功能定义比较丰富,单靠鼠标左键的单击和双击难以满足复杂的需要。

因此有必要开发和扩充VB应用程序对鼠标右键的响应能力。

VB定义的鼠标事件VB定义的鼠标事件有五种:单击(Click)、双击(DblClick)、鼠标键按下(MouseDown)、鼠标键松开(MouseUp)和鼠标光标移动(MouseMove)。

其中前两种事件单击和双击是专指鼠标左键而言,后三种则适用于所有鼠标键。

后三种鼠标事件的事件驱动过程有如下的形式: Sub对象名-鼠标事件(Button As Integer,Shift As Integer, X As Single, Y As Single) 用户插入的事件响应和处理代码End Sub 传递给事件过程的参数中,整型数Button的最低三位从右到左分别对应鼠标左、右、中三个键。

事件发生时,哪个或哪些键处于被按下的状态,Button的对应位就为1,否则为0。

程序中可以用VB的位运算AND来检测鼠标键的状态。

整数Shift的最低三位从右到左分别对应事件发生时键盘的Shift、Ctrl、Alt键。

事件发生时,Shift、Ctrl、Alt中的哪个或哪些键处于被按下的状态,参数Shift 的对应位就为1,否则为0。

单精度值X和Y存放的是事件发生时鼠标光标的X-Y坐标值。

该值对于窗体对象而言是鼠标光标在窗体客户区中的坐标,对于控件对象则是鼠标光标在窗体客户区中相对于控件左上角的坐标。

鼠标右键事件的检测实际上,鼠标的单击事件可以被分解为MouseDown和MouseUp两个事件,所以我们可以用MouseDown事件来取代单击事件。

VB模拟一次鼠标事件

VB模拟一次鼠标事件

VB模拟一次鼠标事件使用API函数mouse_event可以模拟一次鼠标事件,比如左键单击、双击和右键单击等。

这个实例利用此函数产生了十分有趣的效果,无论鼠标处于屏幕的任何位置,每隔一秒程序会使鼠标在那个位置单击或双击一次,这会给我们造成什么样的混乱呢?试一试就知道了。

-------------------------------------------模拟鼠标的左键单击和右键单击-------------------------------------------程序说明:本例采用API函数实现模拟的鼠标事件,程序运行后会产生十分有趣的效果。

也来试一试。

本例中只使用了相对鼠标坐标,我们也可以使用绝对鼠标坐标来试一试。

-------------------------------------------【VB声明】Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)【说明】模拟一次鼠标事件【备注】进行相对运动的时候,由SystemParametersInfo函数规定的系统鼠标轨迹速度会应用于鼠标运行的速度【参数表】dwFlags -------- Long,下述标志的一个组合MOUSEEVENTF_ABSOLUTEdx和dy指定鼠标坐标系统中的一个绝对位置。

在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元 -MOUSEEVENTF_MOVE 移动鼠标MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下MOUSEEVENTF_RIGHTUP 模拟鼠标右键抬起MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下MOUSEEVENTF_MIDDLEUP 模拟鼠标中键抬起dx ------------- Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动dy ------------- Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动cButtons ------- Long,未使用dwExtraInfo ---- Long,通常未用的一个值。

VB模拟按键终极教程

VB模拟按键终极教程

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事件处理程序中添加代码来触发模拟按键操作。

vbs鼠标方法——模拟鼠标按键

vbs鼠标方法——模拟鼠标按键
Case "DBCLICK"
xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
xls.Run "mouse_event", &H2 + &H4, 0, 0, 0, 0
End Select
End Sub
End Class
'***********************************************************************
'代码结束
'***********************************************************************
ቤተ መጻሕፍቲ ባይዱ
'关闭
Private Sub Class_Terminate
xls.DisplayAlerts = False
wbk.Close
xls.Quit
End Sub
'可调用过程
Public Sub getpos( x, y)
x = xls.Run("getx")
reg_key = Replace(reg_key, "$", xls.Version)
S.RegWrite reg_key, 1, "REG_DWORD"
'model 代码
xls_code = _
"Private Type POINTAPI : X As Long : Y As Long : End Type" & vbCrLf & _
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VB模拟鼠标键盘动作有些时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。

那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows 中响应键盘事件的机制。

当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。

如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。

当你按下一个键时,这个键的扫描码就被传给系统。

扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。

键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。

键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。

什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。

无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。

简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。

当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。

然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。

最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。

这个过程可以简单的如下表示:用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。

在VB中,有多种方法可以实现键盘模拟,我们就介绍几种比较典型的。

1.局部级模拟从上面的流程可以看出,键盘事件是最终被送到活动窗口,然后才引起目标程序响应的。

那么最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序。

哈哈,这实在是很简单,windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和PostMessage,它们的区别是PostMessage函数直接把消息仍给目标程序就不管了,而SendMessage把消息发出去后,还要等待目标程序返回些什么东西才好。

这里要注意的是,模拟键盘消息一定要用PostMessage函数才好,用SendMessage是不正确的(因为模拟键盘消息是不需要返回值的,不然目标程序会没反应),切记切记!PostMessage函数的VB声明如下:Declare Function PostMessage Lib"user32"Alias"PostMessageA"(ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long参数hwnd是你要发送消息的目标程序上某个控件的句柄,参数wMsg是消息的类型,表示你要发送什么样的消息,最后wParam和lParam这两个参数是随消息附加的数据,具体内容要由消息决定。

再来看看wMsg这个参数,要模拟按键就靠这个了。

键盘消息常用的有如下几个:WM_KEYDOWN表示一个普通键被按下WM_KEYUP表示一个普通键被释放WM_SYSKEYDOWN表示一个系统键被按下,比如Alt键WM_SYSKEYUP表示一个系统键被释放,比如Alt键如果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam和lParam这两个参数。

在一个键盘消息中,wParam参数的含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam参数的值就设为VK_A,至于lParam这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。

那么我们就详细了解一下lParam吧。

lParam是一个long类型的参数,它在内存中占4个字节,写成二进制就是00000000000000000000000000000000一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还是释放键。

大家一般习惯写成16进制的,那么就应该是&H00000000,第0-15位一般为&H0001;如果是按下键,那么24-31位为&H00,释放键则为&HC0;那么16-23位的扫描码怎么获得呢?这需要用到一个API函数MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。

它的VB声明如下:Declare Function MapVirtualKey Lib"user32"Alias"MapVirtualKeyA" (ByVal wCode As Long,ByVal wMapType As Long)As Long参数wCode表示待转换的码,参数wMapType表示从什么转换为什么,如果是虚拟码转扫描码,则wMapType设置为0;如果是扫描码转虚拟码则wMapType设置为1;如果是虚拟码转ASCII码,则wMapType设置为2。

相信有了这些,我们就可以构造键盘事件的lParam参数了。

下面给出一个构造lParam参数的函数:Declare Function MapVirtualKey Lib"user32"Alias"MapVirtualKeyA" (ByVal wCode As Long,ByVal wMapType As Long)As LongFunction MakeKeyLparam(ByVal VirtualKey As Long,ByVal flag As Long)As Long'参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示Dim s As StringDim Firstbyte As String'lparam参数的24-31位If flag=WM_KEYDOWN Then'如果是按下键Firstbyte="00"ElseFirstbyte="C0"'如果是释放键End IfDim Scancode As Long'获得键的扫描码Scancode=MapVirtualKey(VirtualKey,0)Dim Secondbyte As String'lparam参数的16-23位,即虚拟键扫描码Secondbyte=Right("00"&Hex(Scancode),2)s=Firstbyte&Secondbyte&"0001"'0001为lparam 参数的0-15位,即发送次数和其它扩展信息MakeKeyLparam=Val("&H"&s)End Function这个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN),很简单吧。

值得注意的是,即使你发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会和你发送时的有所不同。

所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。

好了,做完以上的事情,现在我们可以向目标程序发送键盘消息了。

首先取得目标程序接受这个消息的控件的句柄,比如目标句柄是12345,那么我们来对目标模拟按下并释放A键,像这样:(为了简单起见,lParam这个参数就不构造了,直接传0)PostMessage12345,WM_KEYDOWN,VK_A,0&'按下A键PostMessage12345,WM_UP,VK_A,0&'释放A键好了,一次按键就完成了。

现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息,期望记事本里能诡异的自动出现字符。

可是你马上就是失望了,咦,怎么一点反应也没有?你欺骗感情啊~~~~~~~~~~55555555555555不是的哦,接着往下看啊。

一般目标程序都会含有多个控件,并不是每个控件都会对键盘消息作出反应,只有把键盘消息发送给接受它的控件才会得到期望的反应。

那记事本来说,它的编辑框其实是个edit类,只有这个控件才对键盘事件有反应,如果只是把消息发给记事本的窗体,那是没有用的。

现在你找出记事本那个编辑框的句柄,比如是54321,那么写如下代码:PostMessage54321,WM_KEYDOWN,VK_F1,0&'按下F1键PostMessage54321,WM_UP,VK_F1,0&'释放F1键怎么样,是不是打开了记事本的“帮助”信息?这说明目标程序已经收到了你发的消息,还不错吧~~~~~~~~可以马上新问题就来了,你想模拟向记事本按下A这个键,好在记事本里自动输入字符,可是,没有任何反应!这是怎么一回事呢?原来,如果要向目标程序发送字符,光靠WM_KEYDOWN和WM_UP这两个事件还不行,还需要一个事件:WM_CHAR,这个消息表示一个字符,程序需靠它看来接受输入的字符。

一般只有A,B,C等这样的按键才有WM_CHAR消息,别的键(比如方向键和功能键)是没有这个消息的,WM_CHAR消息一般发生在WM_KEYDOWN消息之后。

WM_CHAR消息的lParam参数的含义与其它键盘消息一样,而它的wParam 则表示相应字符的ASCII编码(可以输入中文的哦^_^),现在你可以写出一个完整的向记事本里自动写入字符的程序了,下面是一个例子,并附有这些消息常数的具体值:Declare Function PostMessage Lib"user32"Alias"PostMessageA"(ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As LongDeclare Function MapVirtualKey Lib"user32"Alias"MapVirtualKeyA" (ByVal wCode As Long,ByVal wMapType As Long)As LongPublic Const WM_KEYDOWN=&H100Public Const WM_KEYUP=&H101Public Const WM_CHAR=&H102Public Const VK_A=&H41Function MakeKeyLparam(ByVal VirtualKey As Long,ByVal flag As Long)As LongDim s As StringDim Firstbyte As String'lparam参数的24-31位If flag=WM_KEYDOWN Then'如果是按下键Firstbyte="00"ElseFirstbyte="C0"'如果是释放键End IfDim Scancode As Long'获得键的扫描码Scancode=MapVirtualKey(VirtualKey,0)Dim Secondbyte As String'lparam参数的16-23位,即虚拟键扫描码Secondbyte=Right("00"&Hex(Scancode),2)s=Firstbyte&Secondbyte&"0001"'0001为lparam 参数的0-15位,即发送次数和其它扩展信息MakeKeyLparam=Val("&H"&s)End FunctionPrivate Sub Form_Load()dim hwnd as longhwnd=XXXXXX'XXXXX表示记事本编辑框的句柄PostMessage hwnd,WM_KEYDOWN,VK_A,MakeKeyLparam(VK_A,WM_KEYDOWN)'按下A键PostMessage hwnd,WM_CHAR,ASC("A"),MakeKeyLparam(VK_A,WM_KEYDOWN)'输入字符APostMessage hwnd,WM_UP,VK_A,MakeKeyLparam(VK_A,WM_UP)'释放A键End Sub这就是通过局部键盘消息来模拟按键。

相关文档
最新文档