文档库 最新最全的文档下载
当前位置:文档库 › VB模拟鼠标键盘动作(转)

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

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

2011-03-31 15:16

来自网址:

https://www.wendangku.net/doc/7519297226.html,/share/detail/16221474

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个字节,写成二进制就是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声明如下:

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 Long

Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long

'参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用

WM_KEYDOWN和WM_KEYUP这两个常数表示

Dim s As String

Dim Firstbyte As String 'lparam参数的24-31位

If flag = WM_KEYDOWN Then '如果是按下键

Firstbyte = "00"

Else

Firstbyte = "C0" '如果是释放键

End If

Dim 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)

PostMessage 12345,WM_KEYDOWN,VK_A,0& '按下A键

PostMessage 12345,WM_UP,VK_A,0& '释放A键

好了,一次按键就完成了。现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息,期望记事本里能诡异的自动出现字符。可是你马上就是失望了,咦,怎么一点反应也没有?你欺骗感情啊~~~~~~~~~~55555555555555 不是的哦,接着往下看啊。

一般目标程序都会含有多个控件,并不是每个控件都会对键盘消息作出反应,只有把键盘消息发送给接受它的控件才会得到期望的反应。那记事本来说,它的编辑框其实是个edit类,只有这个控件才对键盘事件有反应,如果只是把消息发给记事本的窗体,那是没有用的。现在你找出记事本那个编辑框的句柄,比如是54321,那么写如下代码:

PostMessage 54321,WM_KEYDOWN,VK_F1,0& '按下F1键PostMessage 54321,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 Long

Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

Public Const WM_KEYDOWN = &H100

Public Const WM_KEYUP = &H101

Public Const WM_CHAR = &H102

Public Const VK_A = &H41

Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long

Dim s As String

Dim Firstbyte As String 'lparam参数的24-31位

If flag = WM_KEYDOWN Then '如果是按下键

Firstbyte = "00"

Else

Firstbyte = "C0" '如果是释放键

End If

Dim 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

Private Sub Form_Load()

dim hwnd as long

hwnd = 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) '输入字符A

PostMessage hwnd,WM_UP,VK_A,

MakeKeyLparam(VK_A,WM_UP) '释放A键

End Sub

这就是通过局部键盘消息来模拟按键。这个方法有一个极大的好处,就是:它可以实现后台按键,也就是说他对你的前台操作不会有什么影响。比如,你可以用这个方法做个程序在游戏中模拟按键来不断地执行某些重复的操作,而你则一边喝茶一边与QQ上的MM们聊得火热,它丝毫不会影响你的前台操作。无论目标程

序是否获得焦点都没有影响,这就是后台模拟按键的原理啦~~~~

2.全局级模拟

你会发现,用上面的方法模拟按键并不是对所有程序都有效的,有的程序啊,你向它发了一大堆消息,可是它却一点反应也没有。这是怎么回事呢?这就要看具体的情况了,有些程序(特别是一些游戏)出于某些原因,会禁止用户对它使用模拟按键程序,这个怎么实现呢?比如可以在程序中检查一下,如果发现自己不是活动窗口,就不接受键盘消息。或者仔细检查一下收到的键盘消息,你会发现真实的按键和模拟的按键消息总是有一些小差别,从这些小差别上,目标程序就能判断出:这是假的!是伪造的!!因此,如果用PostMessage发送局部消息模拟按键不成功的话,你可以试一试全局级的键盘消息,看看能不能骗过目标程序。

模拟全局键盘消息常见的可以有以下一些方法:

(1) 用API函数keybd_event,这个函数可以用来模拟一个键盘事件,它的VB 声明为:

Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

参数bVk表示要模拟的按键的虚拟码,bScan表示该按键的扫描码(一般可以传0),dwFlags表示是按下键还是释放键(按下键为0,释放键为2),dwExtraInfo 是扩展标志,一般没有用。比如要模拟按下A键,可以这样:

Const KEYEVENTF_KEYUP = &H2

keybd_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表示延时的时间,以毫秒为单位。

那么如果要模拟按下功能键怎么做呢?比如要按下Ctrl+C实现拷贝这个功能,可以这样:

keybd_event VK_Ctrl, 0, 0, 0 '按下Ctrl键

keybd_event VK_C, 0, 0, 0 '按下C键

Sleep 500 '延时500毫秒

keybd_event VK_C, 0, KEYEVENTF_KEYUP, 0 '释放C键

keybd_event VK_Ctrl, 0, KEYEVENTF_KEYUP, 0 '释放Ctrl键

好了,现在你可以试试是不是可以骗过目标程序了,这个函数对大部分的窗口程序都有效,可是仍然有一部分游戏对它产生的键盘事件熟视无睹,这时候,你就要用上bScan这个参数了。一般的,bScan都传0,但是如果目标程序是一些DirectX游戏,那么你就需要正确使用这个参数传入扫描码,用了它可以产生正确的硬件事件消息,以被游戏识别。这样的话,就可以写成这样:

keybd_event VK_A, MapVirtualKey(VK_A, 0), 0, 0 '按下A键

keybd_event VK_A, MapVirtualKey(VK_A, 0), KEYEVENTF_KEYUP, 0 '释放A键

以上就是用keybd_event函数来模拟键盘事件。除了这个函数,SendInput函数也可以模拟全局键盘事件。SendInput可以直接把一条消息插入到消息队列中,

算是比较底层的了。它的VB声明如下:

Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long

参数:

nlnprts:定义plnputs指向的结构的数目。

plnputs:指向INPUT结构数组的指针。每个结构代表插人到键盘或鼠标输入流中的一个事件。

cbSize:定义INPUT结构的大小。若cbSize不是INPUT结构的大小,则函数调用失败。

返回值:函数返回被成功地插人键盘或鼠标输入流中的事件的数目。若要获得更多的错误信息,可以调用GetlastError函数。

备注:Sendlnput函数将INPUT结构中的事件顺序地插入键盘或鼠标的输入流中。这些事件与用户插入的(用鼠标或键盘)或调用keybd_event,mouse_event,或另外的Sendlnput插人的键盘或鼠标的输入流不兼容。

嗯,这个函数用起来蛮复杂的,因为它的参数都是指针一类的东西。要用它来模拟键盘输入,先要构造一组数据结构,把你要模拟的键盘消息装进去,然后传给它。为了方便起见,把它做在一个过程里面,要用的时候直接调用好了,代码如下:

Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Type GENERALINPUT

dwType As Long

xi(0 To 23) As Byte

End Type

Type KEYBDINPUT

wVk As Integer

wScan As Integer

dwFlags As Long

time As Long

dwExtraInfo As Long

End Type

Const INPUT_KEYBOARD = 1

Sub MySendKey(bkey As Long)

'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键

Dim GInput(0 To 1) As GENERALINPUT

Dim KInput As KEYBDINPUT

KInput.wVk = bkey '你要模拟的按键

KInput.dwFlags = 0 '按下键标志

GInput(0).dwType = INPUT_KEYBOARD

CopyMemory GInput(0).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput

KInput.wVk = bkey

KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键

GInput(1).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息

CopyMemory GInput(1).xi(0), KInput, Len(KInput)

'以上工作把按下键和释放键共2条键盘消息加入到GInput数据结构中SendInput 2, GInput(0), Len(GInput(0)) '把GInput中存放的消息插入到消息列队

End Sub

除了以上这些,用全局钩子也可以模拟键盘消息。如果你对windows中消息钩子的用法已经有所了解,那么你可以通过设置一个全局HOOK来模拟键盘消息,比如,你可以用WH_JOURNALPLAYBACK这个钩子来模拟按键。

WH_JOURNALPLAYBACK是一个系统级的全局钩子,它和WH_JOURNALRECORD的功能是相对的,常用它们来记录并回放键盘鼠标操作。WH_JOURNALRECORD钩子用来将键盘鼠标的操作忠实地记录下来,记录下来的信息可以保存到文件中,而

WH_JOURNALPLAYBACK则可以重现这些操作。当然亦可以单独使用

WH_JOURNALPLAYBACK来模拟键盘操作。你需要首先声明SetWindowsHookEx函数,它可以用来安装消息钩子:

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

先安装WH_JOURNALPLAYBACK这个钩子,然后你需要自己写一个钩子函数,在系统调用它时,把你要模拟的事件传递给钩子参数lParam所指向的EVENTMSG区域,就可以达到模拟按键的效果。不过用这个钩子模拟键盘事件有一个副作用,就是它会锁定真实的鼠标键盘,不过如果你就是想在模拟的时候不会受真实键盘操作的干扰,那么用用它倒是个不错的主意。

3.驱动级模拟

如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口!

有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就造成,对这样的程序无论用PostMessage或者是keybd_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,得到断码,表示释放这个键

好了,现在的问题就是在VB中如何向端口写入数据了。因为在windows 中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的WINDOWS2000端口操作驱动程序组件(可以到https://www.wendangku.net/doc/7519297226.html,/上去下载)。它不仅可以操作端口,还可以操作内存;不仅能在VB下用,还可以在DELPHI、VC等其它环境下使用,性能特别优异。下载该组件,解压缩后可以看到几个文件夹,其中Release文件夹下的3个文件就是我们需要的,这3个文件是WinIo.sys(用于win xp下的驱动程序),WINIO.VXD(用于win 98下的驱动程序),WinIo.dll(封装函数的动态链接库),我们只需要调用WinIo.dll中的函数,然后WinIo.dll就会安装并调用驱动程序来完成相应的功能。值得一提的是这个组件完全是绿色的,无需安装,你只需要把这3个文件复制到与你的程序相同的文件夹下就可以使用了。用法很简单,先用里面的InitializeWinIo函数安装驱动程序,然后就可以用GetPortVal来读取端口或者用SetPortVal来写入端口了。好,让我们来做一个驱动级的键盘模拟吧。先把winio的3个文件拷贝到你的程序的文件夹下,然后在VB中新建一个工程,添加一个模块,在模块中加入下面的winio函数声明: Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long

Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean

Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean

Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean

Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean

Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean

Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean

Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean

Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean

' ------------------------------------以上是WINIO函数声明

-------------------------------------------

Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long

'-----------------------------------以上是WIN32 API函数声明

-----------------------------------------

再添加下面这个过程:

Sub KBCWait4IBE() '等待键盘缓冲区为空

Dim dwVal As Long

Do

GetPortVal &H64, dwVal, 1

'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中

'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度

Loop While (dwVal And &H2)

End Sub

上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。

然后再添加如下过程,这2个过程用来模拟按键:

Public Const KBC_KEY_CMD = &H64 '键盘命令端口

Public Const KBC_KEY_DATA = &H60 '键盘数据端口

Sub MyKeyDown(ByVal vKeyCoad As Long)

'这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码

Dim btScancode As Long

btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '发送数据前应该先等待键盘缓冲区为空

SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令

'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度

KBCWait4IBE

SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键

End Sub

Sub MyKeyUp(ByVal vKeyCoad As Long)

'这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码

Dim btScancode As Long

btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待键盘缓冲区为空

SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令

KBCWait4IBE

SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键

End Sub

定义了上面的过程后,就可以用它来模拟键盘输入了。在窗体模块中添加一个定时器控件,然后加入以下代码:

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()

Dim VK_A as Long = &H41

MyKeyDown VK_A

MyKeyUp VK_A '模拟按下并释放A键

End Sub

运行上面的程序,就会每隔3秒钟模拟按下一次A键,试试看,怎么样,是不是对所有程序都有效果了?

需要注意的问题:

要在VB的调试模式下使用WINIO,需要把那3个文件拷贝到VB的安装目录中。键盘上有些键属于扩展键(比如键盘上的方向键就是扩展键),对于扩展键不应该用上面的MyKeyDown和MyKeyUp过程来模拟,可以使用下面的2个过程来准确模拟扩展键:

Sub MyKeyDownEx(ByVal vKeyCoad As Long) '模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码

Dim btScancode As Long

btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待键盘缓冲区为空

SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令

KBCWait4IBE

SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息

KBCWait4IBE '等待键盘缓冲区为空

SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令

KBCWait4IBE

SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键End Sub

Sub MyKeyUpEx(ByVal vKeyCoad As Long) '模拟扩展键弹起

Dim btScancode As Long

btScancode = MapVirtualKey(vKeyCoad, 0)

KBCWait4IBE '等待键盘缓冲区为空

SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令

KBCWait4IBE

SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息

KBCWait4IBE '等待键盘缓冲区为空

SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令

KBCWait4IBE

SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键

End Sub

还应该注意的是,如果要从扩展键转换到普通键,那么普通键的KeyDown事件应该发送两次。也就是说,如果我想模拟先按下一个扩展键,再按下一个普通键,那么就应该向端口发送两次该普通键被按下的信息。比如,我想模拟先按下左方向键,再按下空格键这个事件,由于左方向键是扩展键,空格键是普通键,那么流程就应该是这样的:

MyKeyDownEx VK_LEFT '按下左方向键

Sleep 200 '延时200毫秒

MyKeyUpEx VK_LEFT '释放左方向键

Sleep 500

MyKeyDown VK_SPACE '按下空格键,注意要发送两次

MyKeyDown VK_SPACE

Sleep 200

MyKeyUp VK_SPACE '释放空格键

好了,相信到这里,你的模拟按键程序也就差不多了,测试一下,是不是很有效呢

4.骨灰级模拟

方法3算是很底层的模拟了,我现在还没有发现有它模拟无效的程序。但是如果你用尽上面所有的方法,仍然无效的话,那么还有最后一个方法,绝对对任何程序都会有效,那就是:把键盘拿出来,老老实实地按下去吧。~~~~

我用WINIO在VB下模拟鼠标左键点击,具体代码如下:

Private Sub XR()

Dim Result As Boolean

Result = SetPortVal(Val("&H64"), Val("&HD3"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

Sleep 100

Result = SetPortVal(Val("&H64"), Val("&Hf4"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

Result = SetPortVal(Val("&H60"), Val("&H09"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

Result = SetPortVal(Val("&H60"), Val("&H00"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

Result = SetPortVal(Val("&H60"), Val("&H00"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

Result = SetPortVal(Val("&H60"), Val("&H08"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

Result = SetPortVal(Val("&H60"), Val("&H00"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

Result = SetPortVal(Val("&H60"), Val("&H00"), 1)

If (Result = False) Then

MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32"

Unload FrmVBDumpPort32

End If

End Sub

VC 模拟鼠标和键盘输入

VC 模拟鼠标和键盘输入 - 天下 - 博客频道 - https://www.wendangku.net/doc/7519297226.html, 模拟鼠标点击: 1、这里是鼠标左键按下和松开两个事件的组合即一次单击: mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 2、模拟鼠标右键单击事件: mouse_event (MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 ) 3、两次连续的鼠标左键单击事件构成一次鼠标双击事件: mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) mouse_event (MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ) 4、使用绝对坐标 MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 500, 500, 0, 0 需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,如果dx,和dy,用0,0表示,这函数认为是当前鼠标所在的点--直接设定绝对坐标并单击 mouse_event(MOUSEEVENTF_LEFTDOWN, X * 65536 / 1024, Y * 65536 / 768, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, X * 65536 / 1024, Y * 65536 / 768, 0, 0); 其中X,Y分别是你要点击的点的横坐标和纵坐标 模拟键盘输入: [cpp] void EnterString(const char* text) { bool bShift = false; size_t length = strlen(text); for(size_t index = 0;index < length;index++) { int val = text[index]; if(val >= 97 && val <= 122) //小写a-z { val -= 32; bShift = false; } else if(val >= 65 && val <= 90) //大写A-Z { bShift = true;

利用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类型,前者获得鼠标、键盘动作消息,后者回放鼠 标键盘消息。所以在程序中我们需要建立两个消息函数,一个用于纪录鼠标键盘操作并保存到一个数组中,另一个用于 将保存的操作返给系统回放。 下面是具体的程序实现:首先建立一个新工程,在Form1中加入三个CommandButton控件用于控制消息钩子,另外还 可以增加若干Command或者TextBox控件用于检验操作回放的效果。然后在工程中增加一个模块文件,在模块中加入以下 定义和代码: Option Explicit Public Type EVENTMSG message As Long paramL As Long paramH As Long time As Long hwnd As Long End Type Public Declare Function CallNextHookEx Lib "user32" _ (ByVal hHook As Long, _

Visual Basic后台模拟按键

VB万能后台模拟按键 “相信大家对QQ系列的游戏都有所了解,防外挂技术更是了得!都有所谓的驱动保护,常规方法读写内存都无效, 因为TX的驱动过滤了很多常规的API,还有什么分析工具都不能用,对于QQ西游这款游戏来说,CE,ME,RE都不能用, 即使能获得目标进程句柄,游戏还会定时检测,一旦发现如上工具就自行了断了! 还有QQ西游实现挂机也遇到了难题呢,一般的发送窗口按键消息通通封杀,于是有人想到了硬件级的模拟按键, 使用WinIo模拟,默认的驱动被TX封杀了,只有自己写,但是也不能实现后台挂机,这样用处也不大!” [问题一,不能获得窗口句柄] 一般寻找窗口句柄都是直接FindWindow吧,这样是不行的,QQ西游在这些函数上做了一些处理.我来给大家说个万能的方法吧, 对于GetWindowText方法游戏就管不到了,可以配合使用GetWindow来枚举所有的窗口,再判断枚举的窗口里面是否含有游戏窗口标题文字, 最后取其句柄就行了,下面我给段代码,也给还有疑问的朋友一些帮助,唷嘻! Option Explicit Private Declare Function GetDesktopWindow Lib "USER32" () As Long Private Declare Function GetWindow Lib "USER32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long Public Declare Function GetWindowText Lib "USER32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Const GW_CHILD = 5 Private Const GW_HWNDNEXT = 2 Public Function GetHandle(Title As String) As Long Dim tmp As String Dim hwnd As Long Dim lngProcID As Long Dim strTitle As String * 255 '//用来存储窗口的标题 '//取得桌面窗口 hwnd = GetDesktopWindow() '//取得桌面窗口的第一个子窗口 hwnd = GetWindow(hwnd, GW_CHILD) '//通过循环来枚举所有的窗口 Do While hwnd <> 0 '//取得下一个窗口的标题,并写入到列表框中 GetWindowText hwnd, strTitle, Len(strTitle) If left$(strTitle, 1) <> vbNullChar Then tmp = left$(strTitle, InStr(1, strTitle, vbNullChar)) If left(tmp, Len(Title)) = Title Then GetHandle=hwnd End If End If

VC模拟鼠标键盘输入

vc模拟键盘输入 keybd_event(VK_LWIN, 0, 0 ,0); keybd_event('M', 0, 0 ,0); keybd_event('M', 0, KEYEVENTF_KEYUP ,0); keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0); 方法1: HWND hwnd=::FindWindow(0, "文档1"); //假设你要找的窗口标题为“文档1”CWnd::FromHandle(hwnd)->SetForegroundWindow(); ::PostMessage(hwnd, WM_KEYDOWN, VK_ESCAPE, 0L); //发送ESC按下的键盘消息 方法2:这里以向记事本程序发送Ctrl+s按键消息为例: CWnd *pWnd = FindWindow("Notepad", NULL); if (pWnd->GetSafeHwnd()) { pWnd->ShowWindow(SW_NORMAL); pWnd->SetForegroundWindow(); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event('S', 0, 0, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); keybd_event('S', 0, KEYEVENTF_KEYUP, 0); } 对于其他程序,关键就是要找到就收消息的窗口句柄。 ::mouse_event(1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作。 VOID mouse_event( DWORD dwFlags, // 鼠标动作标识。 DWORD dx, // 鼠标水平方向位置。 DWORD dy, // 鼠标垂直方向位置。 DWORD dwData, // 鼠标轮子转动的数量。 DWORD dwExtraInfo // 一个关联鼠标动作辅加信息。 ); 其中,dwFlags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:MOUSEEVENTF_MOVE 表示模拟鼠标移动事件; MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键; MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键; MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键; MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键; MOUSEEVENTF_MIDDLEDOWN 表示模拟按下鼠标中键;

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

VB模拟鼠标键盘动作(转) 2011-03-31 15:16 来自网址: https://www.wendangku.net/doc/7519297226.html,/share/detail/16221474 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)

VB实现模拟键盘输入

Pivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_SETTEXT = &HC Private Sub Command1_Click() Dim hwnd As Long, Thwnd As Long Shell "notepad.exe", 2 '打开一个记事本,将它最小化 hwnd = FindWindow("Notepad", "无标题- 记事本") '得到记事本句柄 Thwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString) '得到记事本句柄(就是我们写字的那里) SendMessage Thwnd, WM_SETTEXT, 0, ByVal "好了,快给我分" '向记事本写入文字 End Sub

VB 有关鼠标的操作

VB 有关鼠标的操作 假如没有鼠标,电脑的普及率绝对没有目前这么高。在windows下,鼠标的作用不亚于键盘。因此,在VB中设计基于windows下的应用程序,鼠标的操作和设计是非常重要的。 一、鼠标的移动、按键事件 要想在VB程序中自如应用鼠标,先要了解有关鼠标的事件,并学会如何编写这些事件过程。最常见的鼠标事件有: 当在某个对象上移动鼠标、按下鼠标按键、释放鼠标按键时均会触发鼠标事件,它们分别是:MouseMove、MouseDown、MouseUp。 这三个鼠标事件过程均会返回四个参数:Button As Integer, Shift As Integer, X As Single, Y

具体解释如下: 1、MouseDown事件 当单击鼠标上的任何一个按键之后,都会引起MouseDown事件。许多对象都有这个事件。如用鼠标在窗体上单击,可以引发这个事件,用鼠标单击“按钮”“标签”“文本框”等对象也可以引发这个事件。该事件还带回来不少参数,下面是鼠标单击窗体任何位置所引发的MouseDown事件,单击其它对象所带回的参数与此相同: Private Sub Form_MouseDown(Button As Integer,Shift As Integer,X As Integer,Y As Integer) End Sub 其中: (1)、Button参数 Button参数带回来的信息是用户按了鼠标上的哪能一个键,左键?右键?还是中间键?Button=1,说明用户按的是鼠标的左键; Button=2,说明用户按的是鼠标的右键; Button=4,说明用户按的是鼠标的中间键; (2)、Shift参数 Shift参数带回来的是用户按鼠标按键时是否同时按下了键盘上的Shift、Ctrl、Alt键。Shift=1,说明用户在按下鼠标按键的同时,还按下了键盘上的Shift键; Shift=2,说明用户在按下鼠标按键的同时,还按下了键盘上的Ctrl键; Shift=3,说明用户在按下鼠标按键的同时,还按下了键盘上的Shift和Ctrl键; Shift=4,说明用户在按下鼠标按键的同时,还按下了键盘上的Alt键; Shift=5,说明用户在按下鼠标按键的同时,还按下了键盘上的Shift和Alt键; Shift=6,说明用户在按下鼠标按键的同时,还按下了键盘上的Ctrl和Alt键; Shift=7,说明用户在按下鼠标按键的同时,还按下了键盘上的Shift、Ctrl和Alt键; (3)、X,Y参数 X,Y参数带回来的是鼠标指针在屏幕上的坐标(x,y)。 2、MouseMove事件 当在任何对象上移动鼠标时,会引发MouseMove事件。下面是鼠标在窗体上任何位置移动所引发的MouseMove事件,鼠标在其它对象上移动所带回的参数与此相同: Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) End Sub 其中所返回的参数Button、Shift、X、Y与MouseDown事件过程返回的参数完全相同,这里不再重复。

vc模拟键盘鼠标命令

vc模拟鼠标键盘操作实用类 //****************** 类mk头文件mk.h ************************** #if !defined(AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_) #define AFX_MK_H__B024D48F_090A_4F6F_A199_32996DF699B3__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "winable.h" class mk { public: mk(); static void Key(BYTE k, int mSeconds=0);//按一个键,mSeconds表按键后到 //下一次操作延迟的时间:ms static void Key2(BYTE k1, BYTE k2,int mSeconds=0);//按2个键 static void Key3(BYTE k1,BYTE k2,BYTE k3,int mSeconds=0);//按3个键 static void Click(int x,int y,int mSeconds=0);//单击 static void RClick(int x,int y,int mSeconds=0);//右击 static void DClick(int x,int y,int mSeconds=0);//双击 static void CtrlClick(int x, int y, int mSeconds=0);//Ctrl+单击 static void Drag(int x1,int y1,int x2,int y2,int mSeconds=0);//鼠标拖动virtual ~mk();

VB键盘与鼠标事件过程

VB键盘与鼠标事件过程 在VB中,键盘和鼠标事件是通过事件处理程序来实现的。事件处理 程序是一段代码,当用户与应用程序的用户界面交互时,会触发这段代码。下面将详细介绍VB中键盘和鼠标事件的过程。 键盘事件过程: 1.事件注册:在VB中,要处理键盘事件,首先需要将事件与特定的 控件关联起来。可以通过在设计视图中选择控件,然后在属性窗口中选择“事件”选项卡来注册事件。 2.事件处理程序:在事件注册后,可以在代码视图中看到为该事件创 建的事件处理程序。事件处理程序是一个特定的过程或函数,当事件触发时,会执行这段代码。可以在事件处理程序中编写逻辑代码来响应键盘事件。 3. 事件参数:在事件处理程序中,可以使用事件参数来获取有关事 件的信息。键盘事件参数通常包括键码(KeyCode)和修饰键(Shift、Ctrl、Alt等)。通过使用这些参数,可以确定用户按下的是哪个键,并 采取相应的操作。 4.事件处理:在事件处理程序中,可以根据需要执行特定的操作。例如,可以根据用户按下的键,执行不同的操作或调用不同的函数。可以使 用条件语句(如If语句)来根据键码执行不同的逻辑。 5.事件冒泡:在VB中,键盘事件通常具有冒泡的特性。这意味着, 当用户在一个控件上按下键时,除了该控件的键盘事件被触发外,还会触 发其父控件的键盘事件。这样可以在不同层次的控件中处理键盘事件。

鼠标事件过程: 1.事件注册:与键盘事件类似,要处理鼠标事件,首先需要将事件与特定的控件关联起来。可以通过在设计视图中选择控件,然后在属性窗口中选择“事件”选项卡来注册事件。 2.事件处理程序:在事件注册后,可以在代码视图中看到为该事件创建的事件处理程序。事件处理程序是一个特定的过程或函数,当事件触发时,会执行这段代码。可以在事件处理程序中编写逻辑代码来响应鼠标事件。 3. 事件参数:在事件处理程序中,可以使用事件参数来获取有关事件的信息。鼠标事件参数通常包括鼠标按钮(Button)和鼠标位置(X、Y 坐标)。通过使用这些参数,可以确定用户点击了哪个鼠标按钮,并获取点击位置的坐标。 4.事件处理:在事件处理程序中,可以根据需要执行特定的操作。例如,可以根据用户点击的鼠标按钮执行不同的操作或调用不同的函数。可以使用条件语句(如If语句)来根据鼠标按钮执行不同的逻辑。 5.事件冒泡:与键盘事件类似,鼠标事件通常也具有冒泡的特性。当用户在一个控件上点击鼠标时,除了该控件的鼠标事件被触发外,还会触发其父控件的鼠标事件。这样可以在不同层次的控件中处理鼠标事件。总结: VB中的键盘和鼠标事件过程包括事件注册、事件处理程序、事件参数、事件处理和事件冒泡。通过注册事件,并在事件处理程序中编写逻辑代码,可以响应用户的键盘和鼠标操作。通过使用事件参数,可以获取有关事件的信息,并根据需要执行特定的操作。事件处理程序可根据键码或

用VB模拟键盘事件的N种方法

用VB模拟键盘事件的N种方法 VB是一种可视化的编程语言,用于创建Windows应用程序。模拟键 盘事件是VB中常见的需求之一,以下是多种方法可以用来实现键盘事件 的模拟。 方法1:使用SendKeys函数 VB中的SendKeys函数可以模拟键盘上的按键事件。它可以发送字符、组合键和特殊键(如回车键、退格键等)的模拟事件。 示例代码: ```vb '模拟按下A键和回车键 SendKeys "A" SendKeys "{ENTER}" ``` 方法2:使用keybd_event函数 VB还可以使用keybd_event函数来模拟键盘事件。keybd_event函数 是Windows API函数,可以通过VB的Declare语句进行引用。 示例代码: ```vb ' 引用Windows API函数

Declare Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) '模拟按下A键 keybd_event Asc("A"), 0, 0, 0 ``` 方法3:使用SendMessage函数 SendMessage函数也是Windows API函数,可以发送消息到指定的窗口。通过SendMessage函数发送WM_KEYDOWN和WM_KEYUP消息可以模拟键盘按键事件。 示例代码: ```vb ' 引用Windows API函数 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long '模拟按下A键 SendMessage hWnd, WM_KEYDOWN, Asc("A"), 0 SendMessage hWnd, WM_KEYUP, Asc("A"), 0 ```

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_Load keybd_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事件处理程序中添加代码来触发模拟按键操作。在按钮的Click事件处理程序中添加以下代码: ``` Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Form_Load End Sub ``` 现在,我们可以运行程序并点击按钮来触发模拟按键操作。在模拟按键操作期间,程序将模拟按下左Alt键和F键,并释放这两个键。

VB6全局键盘、鼠标钩子

VB6全局键盘、鼠标钩子 VB: èü?ì?¢êó±ê13×ó '--------------------------------- 'Form '°2×°13×ó Private sub AddHook() '?ü?ì13×ó lHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0) 'êó±ê13×ó lHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0) End Sub 'D?13×ó 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 Long Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Public Declare Function CallNextHookEx Lib "user32" (ByVal

VB编程的键盘控制

VB编程的键盘控制 我们利用Visual BASIC编写程序,多数情况只涉及到鼠标操作(如单击、双击、拖动等),但如果程序中需要实现文本编辑、热键激活或利用键盘进行游戏控制等功能时,将不可避免地碰到键盘捕获及处理的问题。下面,我们就来看一看VB编程中如何进行键盘控制。 一、概述 在VB中,很多控件都提供了键盘输入功能(如文本框、组合框等),但它们对键盘的处理较简单,遇到复杂一点的要求即无能为力。因而VB提供了KeyPress、KeyUp、KeyDown 三种键盘事件,当用户按键时,会触发这三种事件,而且窗体和接受键盘输入的控件都识别这三种事件。下表对这些事件作了描述。 表1 键盘事件的触发原因 键盘事件触发原因 KeyPress按下某ASCII字符键 KeyDown按下键盘的任意键 KeyUp释放键盘的任意键 KeyDown和KeyUp事件提供了最低级的键盘响应,可用这些事件检测KeyPress事件无法检测到的情况: SHIFT、CTRL和ALT键的特殊组合。 光标控制键。 HOME、END、PAGEUP、PAGEDOWN等。

数字小键盘的数字键与打字键盘数字键的区别。 不仅响应按键操作而且响应释放键操作(KeyPress只响应按键操作)。 键盘事件彼此不相互排斥。按下某键时将生成KeyDown和KeyPress事件,而松开此键时生成KeyUp事件。当用户按下一个KeyPress不能检测的键时将触发KeyDown事件,松开此键时生成KeyUp事件。若使用KeyUp和KeyDown事件应确保KeyPress事件的功能不够用,通常编写KeyPress事件的代码比较容易。 二、KeyPress事件 在按下与ASCII字符对应的键时将触发KeyPress事件。ASCII字符集代表标准键盘的字母、数字和标点符号以及部分控制键(ENTER、TAB、BACKSPACE键等)。KeyDown和KeyUp 事件能够检测其它功能键、编辑键和光标定位键。当处理标准ASCII字符时应使用KeyPress 事件。例如,如果希望将输入到文本框中的所有字符都强制转换为大写字符,则可在输入时使用此事件转换大小写: Private Sub Text1_KeyPress(KeyAscii As Integer) KeyAscii = Asc(Ucase(Chr(KeyAscii))) End Sub KeyAscii参数返回对应所按键的ASCII代码。 也可通过KeyPress事件识别部分控制键。例如,下述事件过程使用 KeyPress检测用户是否正在按BACKSPACE键: Private Sub Text1_KeyPress(KeyAscii As Integer)

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 第6课 简易键盘捕捉

第6课简易键盘捕捉 计算机完成任何任务都是靠数学逻辑运算来进行的,因而计算机本身并不能够像人类一样可以对突发事件进行分析判断,从而独立完成复杂任务,这就是为什么很多时候需要进行人机交互,也就是人类和计算机之间进行相互的交流,计算机将运算的结果反馈给人类,同时人类下达下一步的指令或者对计算机提出的由计算机自身独立无法判断完成的问题做出响应。我们生活中经常接触到的最常见的人机交互设备就是鼠标和键盘,本课就从让计算机能够判断我们的键盘操作展开。 编写意图 在VB6.0程序设计中,窗体的事件和Select...Case开关语句是非常重要的部分,前者是计算机通过响应鼠标键盘等对窗体的操作进而触发的,后者则是VB6.0程序设计中最常用的选择判断语句之一。 本课旨在通过带领学生一同运用VB6.0编写一个“简易键盘捕捉”小程序,初步掌握“事件”的含义及用法,Select...Case开关语句的用法。 内容分析 窗体的事件及事件中参数的用法在课文中已经表述得非常清楚,因而本课实际上主要的教学内容都集中在Select...Case开关语句相关知识地学习上。 教学目标 1.知识与技能 ◆理解并基本掌事件的含义以及事件的用法; ◆理解Select...Case开关语句的概念及逻辑结构,掌握Select...Case开关语句的语法形式和基本用法。 2.过程与方法 ◆通过学生自读教材,结合之前学习过的相关知识,用自己的话归纳并总结出窗体的事件的含义以及事件中参数的基本用法; ◆通过学生自读教材,结合上机实验以及之前学习过的相关知识,自行概括并总结出Select...Case开关语句的概念和逻辑结构。 3.情感态度与价值观 ◆通过学生完成各显神通、博弈舞台中的项目,锻炼并培养学生勇于探索,知难而进的精神; ◆在学生感受具有良好编程习惯的程序员编写的程序给他们带来的便利(代码具有极好的可读性)的同时,使学生懂得任何时候养成良好习惯的重要性。 教学重点

国家二级VB机试键盘与鼠标事件过程模拟试卷5_真题-无答案

国家二级VB机试(键盘与鼠标事件过程)模拟试卷5 (总分52,考试时间90分钟) 1. 选择题 1. 以下关于键盘事件的叙述中,错误的是 A. 按下键盘按键既能触发KeyPress事件,也能触发KeyDown事件 B. KeyDown、KeyUp事件过程中,大、小写字母被视作相同的字符 C. KeyDown、KeyUp事件能够识别Shift、Alt、Ctrl等键 D. KeyCode是KevPress事件的参数 2. 以下可以判断是否在文本框(名称为Text1)内按下了回车键的事件过程是 A. Text1_Change B. Text1_Click C. Text1_KeyPress D. Text1_GotFocus 3. 以下说法中正确的是 A. 当焦点在某个控件上时,按下一个字母键,就会执行该控件的KeyPress事件过程 B. 因为窗体不接受焦点,所以窗体不存在自己的KeyPress事件过程 C. 若按下的键相同,KeyPress事件过程中的KeyAscii参数与KeyDown事件过程中的KeyCode参数的值也相同 D. 在KeyPress事件过程中,KeyAscii参数可以省略 4. 向文本框中输入字符时,下面能够被触发的事件是 A. GotFocus B. KeyPress C. Click D. MouseDown 5. 关于KeyPress事件,以下叙述中正确的是 A. 在控件数组的控件上按键盘键,不能触发KeyPress事件 B. 按下键盘上任一个键时,都能触发KeyPress事件 C. 按字母键时,拥有焦点的控件的KeyPress事件会被触发 D. 窗体没有KeyPress事件 6. 下列事件的事件过程中,参数是输入字符ASCII码的是 A. KeyDown事件 B. KeyUp事件 C. KeyPress事件 D. Change事件 7. 文本框Text1的KeyDown事件过程如下:Private Sub Text1_KeyDown(KeyCode As Integer,Shift As Integer)…End Sub其中参数KeyCode的值表示的是发生此事件时 A. 是否按下了Alt键或Ctrl键 B. 按下的是哪个数字键 C. 所按的键盘键的键码 D. 按下的是哪个鼠标键 8. VB中有3个键盘事件:KeyPress、KeyDown、KeyUp,若光标在Text1文本框中,则每输入一个字母 A. 这3个事件都会触发 B. 只触发KeyPress事件 C. 只触发KeyPress、KeyUp事件 D. 不触发其中任何一个事件

按键精灵命令大全

按键精灵命令大全小技巧:按Ctrl+F,输入命令,即可进行查找定位 键盘命令介绍

键盘命令分为两大类:键盘模拟命令和键盘控制命令。键盘模拟命令可以模拟我们日常操作键盘的行为。操作键盘的动作分为三类:按下、弹起、按下并弹起。键盘控制命令可以在脚本执行过程中通过键盘控制脚本行为。[KeyPress、KeyPressS、KeyPressH] 格式: KeyPress {键盘虚拟码},{次数} 解释: 先“按下”再“弹起”键,模拟我们平时的“按键”操作. 我们在使用键盘的时候有两种操作,一种是”按下”键,一种是”弹起”键.将这两个动作连续进行,就是一个完整的”按键”动作. KeyPressS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和USB接口的键盘都可以使用KeyPressH: 硬件模拟方式,仅支持PS(圆口)的键盘 例子: KeyPress 65,1 65是A键的按键码,上面的语句表示按A键1次 [KeyDown、KeyDownS、KeyDownH] 格式: KeyDown {键盘虚拟码},{次数} 解释: “按下”键,模拟我们平时的“按下”操作 注意:有些键在按下之后,会和其他键产生组合效果,比如“Alt/Ctrl/Shift”, 如果使用“按下Alt”命令,那么之后的“按键”动作将变成“Alt+A”等组合动作, 因此记得在必要时使用“弹起”命令将组合键释放,避免影响键盘的正常使用. KeyDownS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和USB接口的键盘都可以使用KeyDownH: 硬件模拟方式,仅支持PS(圆口)的键盘 例子: KeyDown 65,1 65是A键的按键码,上面的语句表示按下A键1次 [KeyUp、KeyUpS、KeyUpH] 格式: KeyUp {键盘虚拟码} {次数} 解释:“弹起”键,模拟我们平时的“弹起”操作 KeyUpS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和USB接口的键盘都可以使用KeyUpH: 硬件模拟方式,仅支持PS(圆口)的键盘 例子: KeyUp 65,1 65是A键的按键码,上面的语句表示松开A键1次 鼠标命令介绍 鼠标命令分为三大类:模拟鼠标按键命令、模拟鼠标移动命令、鼠标控制命令。模拟鼠标按键可以模拟鼠标的左键、右键、中键和滚轮的动作。鼠标的动作分为三类:按下、弹起、按下并弹起。模拟鼠标移动命令支持移动到屏幕的某个坐标、将鼠标移动一个相对的坐标鼠标控制命令可以在脚本执行过程中通过鼠标控制脚本。[LeftClick、LeftClickS、LeftClickH] 格式:LeftClick {次数} 解释:在鼠标当前位置模拟点击鼠标左键.{次数}可以控制点击的次数 LeftClickS: 超级模拟方式,兼容性更强,对键盘和鼠标没有特别的要求,PS2(圆口)和USB接口的鼠标都可以使用LeftClickH: 硬件模拟方式,仅支持PS(圆口)的鼠标 例子: LeftClick 5 在当前鼠标的位置单击鼠标左键5次 [RightClick、RightClickS、RightClickH] 格式:RightClick {次数}

相关文档