在VB中如何用API监控鼠标和键盘

合集下载

监测键盘状态的方法

监测键盘状态的方法

监测键盘状态的方法下面将介绍几种常见的监测键盘状态的方法:1.轮询模式检测键盘状态:在轮询模式下,应用程序会在一个循环中不断地检测键盘状态。

该循环可以由操作系统提供的API函数实现,也可以由程序员编写自定义的循环来检测键盘状态。

轮询模式是最简单、最常见的键盘监测方法。

其基本流程如下:(1)初始化键盘状态变量。

(2)进入循环。

(3)检测键盘状态。

(4)根据键盘状态来执行相应的操作。

(5)返回第三步。

2.事件驱动模式检测键盘状态:在事件驱动模式下,应用程序会注册一个键盘事件监听器,当有键盘事件发生时,操作系统会通知应用程序,应用程序再根据具体的事件类型做出相应的处理。

其基本步骤如下:(1)注册键盘事件监听器。

(2)进入事件循环。

(3)等待键盘事件发生。

(4)根据事件类型执行相应的操作。

(5)返回第三步。

3.钩子模式检测键盘状态:钩子模式是一种更底层、更复杂的键盘监测方法,它可以在操作系统级别进行键盘状态的监测,因此比轮询模式和事件驱动模式更灵活和强大。

其基本步骤如下:(1)安装键盘钩子。

(2)等待钩子回调函数被触发。

(3)根据钩子回调函数中传递的参数,获取键盘状态。

(4)根据键盘状态执行相应的操作。

(5)返回第二步。

需要注意的是,钩子模式的使用需要一定的权限,因为它可以在操作系统级别进行键盘状态的监测,如果被恶意程序滥用,可能会对系统稳定性和安全性造成威胁。

除了上述三种常见的监测键盘状态的方法,还可以使用操作系统提供的键盘状态查询API函数,例如Windows平台下的GetKeyState函数和GetAsyncKeyState函数,它们可以获取当前按键的状态。

总结起来,监测键盘状态有轮询模式、事件驱动模式和钩子模式等几种常见的方法。

选择哪种方法取决于具体的应用场景和需求。

在实际应用中,可以根据具体情况进行选择和结合使用,以满足对键盘状态监测的要求。

用API函数控制鼠标

用API函数控制鼠标

用API函数控制鼠标天兰兴2001年 13期自微软公司推出Windows操作系统以来,鼠标就成了计算机不可缺少的一部分。

利用鼠标我们可以方便地对计算机进行各种操作。

而在VB中利用Windows API函数也可以轻而易举对鼠标进行操作。

在此,笔者为大家举两个例子。

#1 一、锁定鼠标所谓锁定鼠标,就是将鼠标指针固定到当前位置,既不能单击,也不能双击,就跟死机一般。

方法如下:声明API函数及类型:Private Declare Function ClipCursorBynum& Lib“user32” Alias“ClipCursor”(ByVal lpRect As Long)Private Declare Function ClipCursor Lib“user32”(lpRect As RECT) As Long Private Type RECTLeft As LongTop As LongRight As LongBottom As LongEnd Type锁定鼠标:Dim cc As RECTWith cc.Top = 0.Left = 0.Right = 0.Bottom = 0End WithClipCursor cc释放鼠标:ClipCursorBynum 0#1 二、剪切鼠标所谓剪切鼠标就是将鼠标指针限定到指定区域,在该区域内,鼠标能进行如单击、双击的动作。

方法如下:声明API函数及类型:Private Declare Function ClipCursorBynum& Lib“user32” Alias “ClipCursor”(ByVal lpRect As Long)Private Declare Function GetWindowRect Lib“user32”(ByVal hwnd As Long,lpRect As RECT) As LongPrivate Declare Function ClipCursor Lib“user32”(lpRect As RECT) As Long Private Type RECTLeft As LongTop As LongRight As LongBottom As LongEnd Type剪切鼠标(假设将鼠标指针限定到一窗体Form1内):Dim cc As RECTGetWindowRect Form1.hwnd, ccClipCursor cc释放鼠标:ClipCursorBynum 0#1 三、隐藏鼠标指针声明API函数:Private Declare Function ShowCursor Lib “user32”(ByVal bShow As Long)As Long隐藏鼠标指针:ShowCursor 0显示鼠标指针:ShowCursor 1#1 四、按钮配置与双击速度单击菜单“开始→设置→控制面板”,打开“控制面板”窗口,双击“鼠标”,打开“鼠标属性”的对话框,选择“按钮”选项卡。

VB鼠标的API函数使用详解

VB鼠标的API函数使用详解

VB鼠标的API函数使用详解鼠标是计算机中常用的输入设备之一,通过鼠标用户可以进行控制、操作等操作。

在使用VB编程时,我们可以通过API函数来实现鼠标的一些特定操作,如设置鼠标的位置、隐藏或显示鼠标指针等。

下面我们就来详细介绍一下VB中鼠标的API函数使用方法。

首先,我们需要在VB的代码窗口中声明API函数,这样我们才能在程序中使用这些函数。

在VB中,我们可以使用Declare语句来声明API函数,如下所示:```Private Declare Function 函数名 Lib "dll文件名" (参数列表)As 返回值类型```其中,函数名是API函数的名称,Lib是API函数所在的dll文件名,参数列表是API函数的参数列表,返回值类型是API函数的返回值类型。

1.设置鼠标的位置鼠标的位置可以通过API函数SetCursorPos来设置,代码如下:```Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As LongSub SetMousePosition(ByVal X As Long, ByVal Y As Long)SetCursorPos X, YEnd Sub```在上述代码中,我们使用Declare语句声明了SetCursorPos函数,该函数位于user32.dll文件中。

然后我们定义了一个名为SetMousePosition的子过程,通过调用SetCursorPos函数来设置鼠标的位置。

2.隐藏或显示鼠标指针我们可以使用API函数ShowCursor来隐藏或显示鼠标指针,代码如下:```Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As LongSub HideCursorShowCursor FalseEnd SubSub ShowCursorShowCursor TrueEnd Sub```在上述代码中,我们使用Declare语句声明了ShowCursor函数,该函数位于user32.dll文件中。

在VB中使用API函数(之一)VB-电脑资料

在VB中使用API函数(之一)VB-电脑资料

在VB中使用API函数(之一)VB-电脑资料在VB 中使用API函数(之一) 什么是API? API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制 Windows 的各个部件(从桌面在VB中使用API函数 (之一)什么是API?API(Advanced Programmers Interface,高级程序员接口)(注:API 实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).API 声明正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL 文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.你将会遇到一些问题:假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.消息(Messages)好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你.小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB"好意地"进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好不要使用,因为这与VB 的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB 的断点调试功能,这可能会导致VB崩溃!)需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个32位的参数.。

VFP调用API实现代码模拟鼠标键盘动作

VFP调用API实现代码模拟鼠标键盘动作

VFP调用API实现代码模拟鼠标键盘动作*--VFP调用API实现代码模拟鼠标.键盘动作*--模拟键盘协作,如 Ctrl+VDeclare keybd_event In Win32API Short bVk,Short bScan,Integer dwFlags, Integer deExtraInfokeybd_event(17, 0, 0, 0)keybd_event(Asc('V'), 0, 0, 0)keybd_event(Asc('V'), 0, 2, 0)keybd_event(17, 0, 2, 0)*或#Define VK_CONTROL 0x11#Define KEYEVENTF_KEYUP 0x02Declare Long keybd_event In "user32" Integer bVk , Integer bScan, Long dwFlags, Long dwExtraInfoClear Typeaheadkeybd_event(VK_CONTROL, 0, 0, 0) && 模拟按下 Ctrl 键keybd_event(Asc('V'), 0, 0 ,0) && 模拟按下 V 键keybd_event(Asc('V'), 0, KEYEVENTF_KEYUP, 0) && 松开 V 键keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) && 松开 Ctrl 键* KEYEVENTF_KEYUP = &H2 ' Release key* VK_RETURN = &HD 'enter* VK_SHIFT = &H10 'Shift* VK_CONTROL = &H11 'Ctrl* VK_CAPITAL = &H14 'capslock* VK_ESCAPE = &H1B 'escape*--模拟鼠标动作,如单击左键MOUSEEVENTF_LEFTDOWN=0x2MOUSEEVENTF_LEFTUP=0x4MOUSEEVENTF_MIDDLEDOWN=0x20MOUSEEVENTF_MIDDLEUP=0x40MOUSEEVENTF_MOVE=0x1MOUSEEVENTF_ABSOLUTE=0x8000MOUSEEVENTF_RIGHTDOWN=0x8MOUSEEVENTF_RIGHTUP=0x10Declare mouse_event In Win32API Integer dwFlags,Integer dx,Integer dy,Integer cButtons,Integer dwExtraInfo*在鼠标坐标系统中,不管什么分辨率屏幕在水平和垂直方向上均匀分割成65535×65535个单元=mouse_event(MOUSEEVENTF_ABSOLUTE+MOUSEEVENTF _MOVE,10000,10000,0,0) &&移动鼠标到绝对位置10000,10000 =mouse_event(MOUSEEVENTF_LEFTDOWN+MOUSEEVENT F_LEFTUP,0,0,0,0) &&单击左键(按下再松开的组合)*=mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0)*=mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0)'--以下为VB模拟鼠标的说明及例子'-------------------------------------------'' 模拟鼠标的左键单击和右键单击''-------------------------------------------''程序说明:''本例采用API函数实现模拟的鼠标事件,程序运行后会''产生十分有趣的效果。

在VB中用API函数设置鼠标指针

在VB中用API函数设置鼠标指针

在VB中用API函数设置鼠标指针
杨为民
【期刊名称】《《电脑知识与技术》》
【年(卷),期】2003(000)005
【摘要】在VB中大多数控件都具有MouseDown、MouseUp和MouseMove 三个事件过程,从而可以很方便地使程序响应用户的鼠标操作。

但是有时可能需要
对用户的鼠标作一些限制,或者用代码来设置鼠标,这时需要用WindowsAPI来完成。

在使用VB解决实际问题时,如需要调用Win鄄dowsAPI函数,或需要剪切、
移动、显示和隐藏鼠标指针,或生成鼠标动作,本文中的代码、方法皆可引用或借鉴。

【总页数】4页(P56-59)
【作者】杨为民
【作者单位】
【正文语种】中文
【中图分类】TP311.1
【相关文献】
1.VB中用API函数实现波形采集及保存的方法 [J], 杜玉杰;纪延俊
2.在VB中用API函数实现在任务管理器中隐藏应用程序 [J], 寇海洲;赵文东
3.在VB中用WinAPI函数放置"透明"的图片 [J], 赵文东;王素珍;赵杰
4.在VB中用API函数给桌面托盘增加图标 [J], 雍震;姚君遗
5.VB中用API函数和类模块实现RichTextBox控件 [J], 刘洪君;孙盛坤
因版权原因,仅展示原文概要,查看原文内容请购买。

vb如何控制鼠标

vb如何控制鼠标

vb如何控制鼠标来源:作者:2007-10-24 出处:主要是要通过两个方面:(一)对鼠标的停留位置做出判断,也就是得到鼠标在屏幕上停留的位置。

(二)将鼠标的移动到所确定的位置上。

而实现这个功能则要使用到SetCursorPos这个函数,此函数的功能是设定鼠标位置。

这个函数的声明如下:Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long而仅仅有这个函数是不够的,还需要定义一个type格式的自定义变量。

定义为:Public Type POINTAPIx As Longy As LongEnd Type它用于存放鼠标的位置(屏幕上的位置)。

但是一个新的问题又出现了:鼠标到底放在哪里呢?也就是如何获得屏幕上的位置。

这个问题就要用到另一个函数:GetCursorPos,它的功能是获得屏幕上鼠标的坐标。

它的声明如下:Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long这样就可以通过GetCursorPos函数获得鼠标的位置,存放到一个POINTAPI变量中,再通过SetCursorPos函数来设置鼠标的位置。

这样就可以十分顺利的来控制鼠标了!最近我在做一个项目,需要把数据用图表形式显示出来,用的是VB+ACCESS,请问如何把字段放到图表的XY轴的刻度上?Private Sub Command2_Click()Dim arrPriceQuantity(1 To 5, 1 To 2)Dim i As IntegerFor i = 1 To 5arrPriceQuantity(i, 1) = i ' Series 1Next iMSChart1.ChartData = arrPriceQuantityEnd SubVB6.0中的MSChart控件是一个功能强大的高级图表工具,拥有丰富的图表绘制功能,可显示二维和三维的棒图、区域图、线形图、饼图等多种常用图表。

VB6VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

VB6VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

VB6VBA中跟踪⿏标移出窗体控件事件(类模块成员函数指针CHooker类应⽤)⼀、关于起因前⼏天发了⼀篇博⽂,是关于获取VB类模块成员函数指针的内容();今天我就发⼀下我的应⽤实例。

VB中默认是没有⿏标移出事件响应的,⽽这个事件其实在项⽬开发中,实⽤性很强,很多时候需要在⿏标移出窗体或控件时做些事情;没有这个事件会感觉很费⼒;今天我所说的实际案例就是,在窗体上,设计⼀个SplitterBar控件,窗体的最终⽤户使⽤这个控件可以在运⾏程序时任意调整其内部控件⼤⼩。

⼆、修改CHooker类我在第⼆篇参考博⽂作者开发的CHooker类上做了部分修改(对应以下代码中的中⽂注释部分代码),使该类能够跟踪⿏标移开事件,代码如下:1Option Explicit23Private Type TRACKMOUSEEVENTTYPE4 cbSize As Long5 dwFlags As Long6 hwndTrack As Long7 dwHoverTime As Long8End Type910Private Declare Sub CopyMemory Lib"kernel32"Alias"RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)11Private Declare Function SetWindowLong Lib"user32"Alias"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long12Private Declare Function GetWindowLong Lib"user32"Alias"GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long13Private Declare Function IsWindow Lib"user32" (ByVal hWnd As Long) As Long14Private 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 Long 15Private Declare Function TrackMouseEvent Lib"user32" (lpEventTrack As TRACKMOUSEEVENTTYPE) As Long1617Private Const GWL_WNDPROC = (-4)18Private Const WM_NCDESTROY = &H8219Private Const WM_MOUSEMOVE = &H20020Private Const TME_LEAVE = &H2&21Private Const WM_MOUSELEAVE = &H2A3&2223Public Event WindowProc(ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long, bCallNext As Boolean, lReturn As Long)2425Private m_hwnd As Long, m_NewProc As Long, m_OldProc As Long26Private m_TrackMouseLeave As Boolean'm_TrackMouseLeave设置在Hook时是否开启跟踪⿏标移开事件,是否正在跟踪移动事件27Private m_Tracking As Boolean'跟踪移开事件时,标识当前是否正在跟踪移动事件2829Private Sub Class_Initialize()30 m_NewProc = GetClassProcAddr(Me, 5, 4, True)31End Sub3233Private Sub Class_Terminate()34Call Unbind35End Sub3637Public Function Bind(ByVal hWnd As Long, Optional TrackMouseLeave As Boolean = False) As Boolean38Call Unbind39If IsWindow(hWnd) Then m_hwnd = hWnd40 m_OldProc = SetWindowLong(m_hwnd, GWL_WNDPROC, m_NewProc)41 Bind = CBool(m_OldProc)42 m_TrackMouseLeave = TrackMouseLeave '保存⽤户传递的跟踪⿏标移开事件设置43End Function4445Public Function Unbind() As Boolean46If m_OldProc <> 0Then Unbind = CBool(SetWindowLong(m_hwnd, GWL_WNDPROC, m_OldProc))47 m_OldProc = 048End Function4950Private Function WindowProcCallBack(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long51Dim bCallNext As Boolean, lReturn As Long52Dim tTrackML As TRACKMOUSEEVENTTYPE '⼀个移开事件结构声明5354 bCallNext = True5556RaiseEvent WindowProc(Msg, wParam, lParam, bCallNext, lReturn)57'当⽤户需要跟踪⿏标移开事件时58If m_TrackMouseLeave Then59'⿏标在其上移动,当前未标识为跟踪状态(第⼀次或者移开⿏标后重新移动回来时)60If Msg = WM_MOUSEMOVE And m_Tracking = False Then61 m_Tracking = True62'initialize structure63 tTrackML.cbSize = Len(tTrackML)64 tTrackML.hwndTrack = hWnd65 tTrackML.dwFlags = TME_LEAVE66'start the tracking67 TrackMouseEvent tTrackML68End If69'⿏标移开时,取消跟踪状态70If Msg = WM_MOUSELEAVE Then m_Tracking = False71End If7273If bCallNext Then74 WindowProcCallBack = CallWindowProc(m_OldProc, hWnd, Msg, wParam, lParam)75Else76 WindowProcCallBack = lReturn77End If78If hWnd = m_hwnd And Msg = WM_NCDESTROY Then Call Unbind79End Function8081Private Function GetClassProcAddr(obj As Object, ByVal Index As Long, _82Optional ByVal ParamCount As Long = 4, Optional ByVal HasReturnValue As Boolean) As Long83Static lReturn As Long, pReturn As Long84Static AsmCode(50) As Byte8586Dim i As Long, pThis As Long, pVtbl As Long, pFunc As Long8788 pThis = ObjPtr(obj)89 CopyMemory pVtbl, ByVal pThis, 490 CopyMemory pFunc, ByVal pVtbl + (6 + Index) * 4, 491 pReturn = VarPtr(lReturn)92For i = 0To UBound(AsmCode) '填充nop93 AsmCode(i) = &H9095 AsmCode(0) = &H55 'push ebp96 AsmCode(1) = &H8B: AsmCode(2) = &HEC 'mov ebp,esp97 AsmCode(3) = &H53 'push ebx98 AsmCode(4) = &H56 'push esi99 AsmCode(5) = &H57 'push edi100If HasReturnValue Then101 AsmCode(6) = &HB8 'mov offset lReturn102 CopyMemory AsmCode(7), pReturn, 4103 AsmCode(11) = &H50 'push eax104End If105For i = 0To ParamCount - 1'push dword ptr[ebp+xx]106 AsmCode(12 + i * 3) = &HFF107 AsmCode(13 + i * 3) = &H75108 AsmCode(14 + i * 3) = (ParamCount - i) * 4 + 4109Next110 i = i * 3 + 12111 AsmCode(i) = &HB9 'mov ecx,this112 CopyMemory AsmCode(i + 1), pThis, 4113 AsmCode(i + 5) = &H51 'push ecx114 AsmCode(i + 6) = &HE8 'call 相对地址115 CopyMemory AsmCode(i + 7), pFunc - VarPtr(AsmCode(i + 6)) - 5, 4116If HasReturnValue Then117 AsmCode(i + 11) = &HB8 'mov eax,offset lReturn118 CopyMemory AsmCode(i + 12), pReturn, 4119 AsmCode(i + 16) = &H8B 'mov eax,dword ptr[eax]120 AsmCode(i + 17) = &H0121End If122 AsmCode(i + 18) = &H5F 'pop edi123 AsmCode(i + 19) = &H5E 'pop esi124 AsmCode(i + 20) = &H5B 'pop ebx125 AsmCode(i + 21) = &H8B: AsmCode(i + 22) = &HE5 'mov esp,ebp126 AsmCode(i + 23) = &H5D 'pop ebp127 AsmCode(i + 24) = &HC3 'ret128 GetClassProcAddr = VarPtr(AsmCode(0))129End Function三、CHooker类的使⽤那么如何使⽤这个新构建的类,来实现我们的需求了?⾸先创建⼀个窗体,放置三个PictureBox,其中⼀个做为SplitterBar(name属性picture4),其余2个图⽚框的宽度将会由SplitterBar在运⾏时调整。

VB电脑监控

VB电脑监控

一、程式核心本程式的核心是通過API函數獲得視窗控制碼並獲得瀏覽器訪問的網址,在此基礎上可以實現用Winsock控制項進行遠端的監視和管理。

1.先創建一個工程並在視窗Form1中,並聲明下面的四個API函數和兩個常量:Option Explicit Private Declare Function FindWindow Lib ″user32″ Alias ″FindWindowA″ (ByVal lpCl assName As String,ByVal lpWindowName As String) As Long′Findwindow函數的功能是找到當前運行的IE視窗的url位址的控制碼Private Declare Function SendMessage Lib ″user32″ Alias ″SendMessageA″ (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Long) As Long′SendMessage函數的功能是向作業系統發送一條消息P rivate 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′FindwindowEx函數的功能是找到子表單的控制碼Private Declare Function SendMessageByString Lib ″user32″ Alias ″SendMessageA″ (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,ByVal lParam As String) As LongPrivate Const WM_GETTEXT = &HDPrivate Const WM_GETTEXTLENGTH = &HE2.在表單上添加Command控制項,並命名為GetURLstring,按一下此命令按鈕,並為其添加下面的程式碼:Private Sub GetURLstring_Click()On Error GoTo CallErrorADim sClassName As String ′設定一個字串變數,是類變數Dim lhwnd As Long ′設定一個長整形變數用來接收函數傳回值Dim WindowHandle As Long ′設定一個長整形變數用來接收函數的返回控制碼lhwnd = 0sClassName = (″IEFrame″)lhwnd = FindWindowEx(lhwnd,0,sClassName,vbNullString) ′獲得URL網址列的控制碼,獲得IE視窗的控制碼sClassName = (″WorkerA″)lhwnd = FindWindowEx(lhwnd,0,sClassName,vbNullString) ′獲得IE視窗的工作區的控制碼sClassName = (″ReBarWindow32″)lhwnd = FindWindowEx(lhwnd,0,sClassName,vbNullString) ′獲得IE視窗的功能表列的控制碼sClassName = (″ComboBoxEx32″)lhwnd = FindWindowEx(lhwnd,0,sClassName,vbNullString) ′獲得IE視窗的下拉式功能表的控制碼sClassName = (″ComboBox″)lhwnd = FindWindowEx(lhwnd,0,sClassName,vbNullString) ′獲得IE視窗的下拉式功能表當前項的控制碼sClassName = (″Edit″)lhwnd = FindWindowEx(lhwnd,0,sClassName,vbNullString) ′獲得這個下拉式功能表的編輯方塊控制碼WindowHandle = lhwnd ′接收當前我們想要的控制碼Dim buffer As String ′設定字串變數接收當前的字串Dim TextLength As Long ′設定長整形變數接收字串的長度TextLength = SendMessage(WindowHandle,WM_GETTEXTLENGTH,0&,0&) ′向系統發送獲得IE視窗的網址列中的字串長度命令buffer = String(TextLength,0) ′Call SendMessageByString(WindowHandle,WM_GETTEXT,TextLength +1,buffer) ′向系統發送獲得IE 表單網址列中的字串命令If buffer = ″″ ThenMsgBox ″MicroSoft InternetExplorer瀏覽器沒有運行.″,vbOKOnlyElseMsgBo x buffer ′IE運行時顯示當前網址End IfExit SubCallErrorA:MsgBox Err.DescriptionErr.ClearEnd Sub二、添加定時保存功能我們對上面的程式稍作改動,即可實現定時把當前訪問的網址保存到檔,這樣就為我們進行網路監控提供了保證。

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建立鼠标键盘操作回放

利用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鼠标的API函数使用详解

VB鼠标的API函数使用详解

1.变换鼠标左右键添加Command1Private Declare Function SwapMouseButton Lib "user32" (ByV al bSwap As Long) As LongPrivate Sub Command1_Click()SwapMouseButton TrueMsgBox "退出前你现在是左撇子"End SubPrivate Sub Form_Unload(Cancel As Integer)SwapMouseButton FalseMsgBox "鼠标左右键已灰复"End Sub2.得知鼠标位置'添加Timer1Option Explicit'*********************** 得知鼠标位置的API ******************************* Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Type POINTAPIX As LongY As LongEnd Type'*************************************************************************Private Sub Form_Load()Timer1.Interval = 10End SubPrivate Sub Timer1_Timer()Dim Point As POINTAPIGetCursorPos PointMe.Caption = Point.X & " " & Point.YEnd Sub3.动画鼠标'添加Picture1Option ExplicitPrivate Const GCL_HCURSOR& = (-12)Private Declare Function SetClassLong& Lib "user32" Alias "SetClassLongA" (ByV al hWnd As Long, ByV al nIndex As Long, ByV al dwNewLong As Long)Private Declare Function LoadCursorFromFile& Lib "user32" Alias "LoadCursorFromFileA"(ByV al lpFileName As String)Private NewCursor1 As LongPrivate OldCursor1 As LongPrivate NewCursor2 As LongPrivate OldCursor2 As LongDim appdisk$, winpath$Private Sub Form_Load()appdisk = Trim(App.Path)If Right(appdisk, 1) <> "\" Then appdisk = appdisk & "\"winpath = Environ("windir") 'windows系统路径NewCursor1 = LoadCursorFromFile(winpath & "\cursors\appstart.ani") 'windows的cursors 自带的.aniOldCursor1 = SetClassLong(Me.hWnd, GCL_HCURSOR, NewCursor1)NewCursor2 = LoadCursorFromFile(appdisk & "dinol.ani")OldCursor2 = SetClassLong(Picture1.hWnd, GCL_HCURSOR, NewCursor2)End SubPrivate Sub Form_Unload(Cancel As Integer)SetClassLong Me.hWnd, GCL_HCURSOR, OldCursor1SetClassLong Picture1.hWnd, GCL_HCURSOR, OldCursor2End Sub4.模拟点击鼠标'添加Command1 Command2 Command3Option Explicit'****************************************************************************** ***Private Declare Function SetCursorPos Lib "user32" (ByV al X As Long, ByV al Y As Long) As LongPrivate Declare Sub mouse_event Lib "user32" (ByV al dwFlags As Long, ByV al dx As Long, ByV al dy As Long, ByV al cButtons As Long, ByV al dwExtraInfo As Long)Const MOUSEEVENTF_LEFTDOWN = &H2Const MOUSEEVENTF_LEFTUP = &H4Const MOUSEEVENTF_RIGHTDOWN = &H8Const MOUSEEVENTF_RIGHTUP = &H10'****************************************************************************** ***Dim x1&, y1&Private Sub Form_Load()Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 '窗体置于屏幕中心Command1.Caption = "模拟点左键"Command2.Caption = "模拟点右键"End SubPrivate Sub Command1_Click()x1 = (Me.Left + Command3.Left + Command3.Width / 2) \ 15y1 = (Me.Top + Command3.Top + Command3.Height / 2 + 405) \ 15SetCursorPos x1, y1mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End SubPrivate Sub Command2_Click()x1 = (Me.Left + Command3.Left + Command3.Width / 2) \ 15y1 = (Me.Top + Command3.Top + Command3.Height / 2 + 405) \ 15SetCursorPos x1, y1mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 End SubPrivate Sub Command3_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)If Button = 2 ThenMsgBox "您点击了右键"ElseMsgBox "您点击了左键"End IfEnd Sub5.模拟鼠标移动'添加Command1Option Explicit'********************************* 时间延迟的API *************************** Private Declare Sub Sleep Lib "kernel32" (ByV al dwMilliseconds As Long)'********************************* 设置鼠标位置的API *********************** Private Declare Function SetCursorPos Lib "user32" (ByV al X As Long, ByV al Y As Long) As Long'****************************************************************************Dim x1&, y1&, x2&, y2&Private Sub Form_Load()Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 '窗体置于屏幕中心'将Command1置于窗体中心Command1.Move (Me.ScaleWidth - Command1.Width) \ 2, (Me.ScaleHeight - Command1.Height) \ 2Command1.Caption = "模拟鼠标移动"x1 = (Me.Left + Command1.Left + Command1.Width / 2 + 60) \ 15y1 = (Me.Top + Command1.Top + Command1.Height / 2 + 405) \ 15SetCursorPos x1, y1 '将鼠标移动到Command1上面End SubPrivate Sub Command1_Click()Randomizex1 = Int(Rnd * (Screen.Width \ 15))y1 = Int(Rnd * (Screen.Height \ 15))x2 = (Me.Left + Command1.Left + Command1.Width / 2 + 60) \ 15y2 = (Me.Top + Command1.Top + Command1.Height / 2 + 405) \ 15DoIf Abs(x1 - x2) >= 4 Thenx1 = IIf(x1 > x2, x1 - 4, x1 + 4)End IfIf Abs(y1 - y2) >= 3 Theny1 = IIf(y1 > y2, y1 - 3, y1 + 3)End IfSetCursorPos x1, y1Sleep 10 '延迟5毫秒If Abs(x1 - x2) <= 4 And Abs(y1 - y2) <= 3 Then Exit DoLoopEnd Sub6.鼠标定位在窗体中间'鼠标定位在窗体中间Private Declare Function SetCursorPos Lib "user32" (ByV al x As Long, ByV al y As Long) As LongPrivate Sub Form_Load()Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2SetCursorPos (Me.Left + (Me.Width \ 2)) \ 15, (Me.Top + (Me.Height \ 2)) \ 15End Sub7.鼠标是否在窗体上'添加Timer1Option Explicit'*****************************************************Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPrivate Declare Function GetWindowRect Lib "user32" (ByV al hwnd As Long, lpRect As RECT) As LongPrivate Type POINTAPIx As Longy As LongEnd TypePrivate Type RECTLeft As LongTop As LongRight As LongBottom As LongEnd Type'*************************************************Private Sub Form_Load()Timer1.Interval = 10Timer1.Enabled = TrueEnd SubPrivate Sub Timer1_Timer()Dim P As POINTAPI, R As RECTGetCursorPos PGetWindowRect Me.hwnd, RIf P.x < R.Left Or P.x > R.Right Or P.y < R.Top Or P.y > R.Bottom ThenMe.Caption = "不在"ElseMe.Caption = "在"End IfEnd Sub8.鼠标限制在窗体内.txt'添加Picture1 Command1 Command2Option Explicit'***************************************************************Private Type RECTleft As Longtop As Longright As Longbottom As LongEnd TypePrivate Declare Function SetCursorPos Lib "user32" (ByV al x As Long, ByV al y As Long) As LongPrivate Declare Function ClipCursor Lib "user32" (lpRect As Any) As LongPrivate Declare Function GetWindowRect Lib "user32" (ByV al hwnd As Long, lpRect As RECT) As LongPrivate Declare Function GetSystemMetrics Lib "user32" (ByV al nIndex As Long) As Long Const SM_CYCAPTION = 4Const SM_CXFRAME = 32Const SM_CYFRAME = 33'******************************************************Dim x1%, y1%Dim r As RECTPrivate Sub Form_Load()Command1.Caption = "将鼠标限制在PictureBox内"Command2.Caption = "将鼠标限制在窗体内"Picture1.AutoRedraw = TruePicture1.Width = 2000Picture1.Print "在图片匡内双击释放鼠标"Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 SetCursorPos (Me.left + Me.Width \ 2) \ 15, (Me.top + Me.Height \ 2) \ 15 End SubPrivate Sub Form_Unload(Cancel As Integer)Call ReleaseEnd Sub' 将鼠标限制在PictureBox内Private Sub Command1_Click()RestrictToControl Picture1 'RestrictToControl在模块程序中有定义CenterOnControl Picture1End Sub'将鼠标限制在窗体内Private Sub Command2_Click()RestrictToForm MeCenterOnForm MeEnd Sub' 双击鼠标左键释放光标Private Sub Picture1_DblClick()Call ReleaseEnd SubPrivate Sub Release()Call ClipCursor(ByV al vbNullString)End SubPrivate Sub RestrictToControl(cntl As Control)On Error Resume NextCall GetWindowRect((cntl.hwnd), r)If Err.Number = 0 Then Call RestrictToRect(r)End SubPrivate Sub CenterOnControl(cntl As Control)On Error Resume NextCall GetWindowRect((cntl.hwnd), r)If Err.Number = 0 Then CenterOnRect rEnd SubPrivate Sub CenterOnForm(frm As Form)Call GetClientScrnRect(frm, r)Call CenterOnRect(r)End SubPrivate Sub RestrictToForm(frm As Form)Call GetClientScrnRect(frm, r)Call RestrictToRect(r)End SubPrivate Sub RestrictToRect(lpRect As RECT)Call ClipCursor(lpRect)End SubPrivate Sub CenterOnRect(lpRect As RECT)Call SetCursorPos(lpRect.left + (lpRect.right - lpRect.left) \ 2, lpRect.top + (lpRect.bottom - lpRect.top) \ 2)End SubPrivate Sub GetClientScrnRect(frm As Form, rC As RECT)Call GetWindowRect((frm.hwnd), rC)x1 = GetSystemMetrics(SM_CXFRAME)y1 = GetSystemMetrics(SM_CYFRAME)rC.left = rC.left + x1rC.right = rC.right - x1rC.top = rC.top + y1 + GetSystemMetrics(SM_CYCAPTION)rC.bottom = rC.bottom - y1End Sub9.隐藏鼠标'添加Command1'True:1 显示鼠标/ 0 False:隐藏鼠标'****************************************************Private Declare Function ShowCursor Lib "user32" (ByV al bShow As Long) As Long'****************************************************************Private Sub Form_Load()Me.KeyPreview = TrueEnd SubPrivate Sub Command1_Click()ShowCursor (0)Me.Caption = "鼠标已隐藏,请按任何键退出" '别管任务栏还看得到,全屏即看不到了. End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If KeyCode <> 0 Then Unload MeEnd SubPrivate Sub Form_Unload(Cancel As Integer)ShowCursor (1)Set Form1 = NothingEnd Sub10.自创手指图标Option ExplicitPrivate Declare Function SetCursor Lib "user32" (ByV al hCursor As Long) As LongPrivate Sub Form_Unload(Cancel As Integer)SetCursor 65553End SubPrivate Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)SetCursor 65581End Sub。

如何使用vb监控电脑活动记录

如何使用vb监控电脑活动记录

如何使用vb监控电脑活动记录目录·主要函数·实现·开启自启动·运行最近看到了一个日文版的监控电脑活动记录的软件,又在win 32 APi中看到了GetForegroundWindow函数,于是决定动动小手用vb 写个监控电脑活动记录的小程序。

主要函数5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8Module Module1private Declare Sub Sleep Lib"kernel32"Alias"Sleep"(ByVal dwMillisecondsAs Long)'Win32 ApiPrivate Declare Function GetForegroundWindowLib"user32"() As LongPrivate Declare Function GetWindowTextLib"user32"Alias"GetWindowTextA"(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongSub Main()Dim bt As Boolean= True' 保存标题文本Dim stext As String' 保存上一个窗口句柄Dim hwnd As Long' 保存当前窗口句柄Dim curHwnd As Long' 书写流写入日志文件Dim sw As StreamWriter' 日志文件保存路径Dim path As String= "c:\log.txt"' 如果存在日志文件则跳过,否则创建一个日志文件If Not File.Exists(path) ThenFile.Create(path)2 93 0 3 1 3 2 3 3 34 35 36 37 38 39 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5End Ifsleep(3000)' 这里是个死循环While btstext = Space(255)' 获取当前窗口句柄hwnd = GetForegroundWindow' 如果当前是新窗口则写入新窗口标题If hwnd <> curHwnd ThencurHwnd = hwnd' 获取窗口标题GetWindowText(hwnd,stext,255)sw = System.IO.File.AppendText(path)' 写入新窗口标题,格式 yyyy年mm 月dd日 hh:hh:ss + 标题Using swsw.WriteLine(String.For mat("{0:F}", DateTime.Now) +" "+ stext)sw.Flush()End UsingEnd Ifsleep(2000)End While重启电脑后我们可以再任务管理器中看到运行的脚本然后查看日志文件C:\log.txt需要关闭结束进程即可。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

VB实例6 追踪鼠标和按键

VB实例6 追踪鼠标和按键

实例6 追踪鼠标和按键“追踪鼠标和按键”程序运行后,当鼠标指针在窗口中移动时,会在窗口中实时显示鼠标的当前位置;当键盘上的某个按键被按下时,将在窗口中显示该按键的信息:当鼠标双击窗口时,会在窗口中显示出相关的信息。

1.创建程序界面创建一个“标准EXE”‘工程,设置窗体From1的Caption属性为“按键鼠标”,Font属性为隶书、四号、粗体,ForeColor属性为蓝色。

2.程序代码编辑在窗体的“代码”窗口中输入以下代码。

Private Sub Form_DblClick()Me.Cls '清除窗口显示的文字Print '打印一个空行Print "鼠标双击窗体" '在窗体中显示文字"鼠标双击窗体"End SubPrivate Sub Form_KeyPress(KeyAscii As Integer)Me.ClsPrintPrint "键盘上的"; Chr$(KeyAscii); "键被按下" '在窗体上显示键盘按键信息End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X AsSingle, Y As Single)Me.ClsPrintPrint "鼠标当前坐标是:"; X; ","; Y '在窗体上显示鼠标位置End Sub程序中的关键字 Me代表了程序所在的窗体,“Me.Cls”即表示清除当前窗体上所显示的文字。

Print办法用于在窗体中显示文字或者数据,当Print后边没有参数时,表示打印一个空行,以用于换行等用途。

当需要在同一行中打印多个数据时,可以用分号“;”将各个参数区分开,例如:本程序中的“Print”鼠标当前坐标是:”;X;”,”:Y”语句。

vb中键盘鼠标事件

vb中键盘鼠标事件

第12章键盘与鼠标事件过程Visual Basic应用程序能够响应多种键盘事件和鼠标事件。

例如,窗体、图片框与图像控件都能检测鼠标指针的位置,并可判定其左、右键是否已经按下,还能响应鼠标按钮与Shift、Ctrl或Alt键的各种组合。

利用键盘事件可以编程响应多种键盘操作,也可以解释、处理ASCII字符。

Visual Basic应用程序还支持大多数控件及OLE的拖放功能,可用控件的Drag方法连同某些属性和事件宋实现控件的拖放操作。

OLE的拖放使应用程序的数据交换功能大大增强。

本章将对键盘和鼠标事件进行详细讲解,使读者掌握利用键盘和鼠标进行编程的基本技术。

12.1键盘事件键盘事件是用户与程序之间交互操作中的主要元素之—。

单击鼠标和按下按键都可以触发事件,而且还提供进行数据输入的手段以及在窗口和菜单中移动的基本形式。

键盘事件有三种,即KeyPress、KeyUp和KeyDown事件。

窗体和可接受键盘输入的控件(如文本框TextBox、命令按钮CommandButton、图片框PictureBox、组合框ComboBox 等)都可识别这些事件。

值得注意的是,只有获得焦点的对象才能够接受键盘事件。

对于窗体,只有成为活动窗体并且窗体中的任何控件均未获得焦点时,才会产生窗体的键盘事件。

窗体中任何控件已经获得焦点时,会产生控件的键盘事件。

12.1.1 KeyPress事件当用户按下键盘上的某个键时,将触发KeyPress事件。

该事件可以用于窗体和大部分标准控件,严格来说,当按下某个键时,所触发的是具有输入焦点(FOCUS)的那个控件的KeyPress事件。

在某一时刻,输入焦点只能位于某一个控件上,如果窗体上没有可见或有效的控件,则输入焦点位于窗体上。

当一个控件或窗体拥有输入焦点时,该控件或窗体将接受从键盘上输入的信息。

例如,假定一个文本框拥有输入焦点,则从键盘上输入的任何字符都将在该文本框上回显。

KeyPress事件过程的一般格式是:Private Sub对象名KeyPress(KeyAscii as Integer)事件过程End Sub如果接受KeyPress事件的对象为控件数组,对应的事件过程的格式为:Private Sub 对象名_KeyPress(Index as Integer,KeyAscii AS Integer)事件过程End Sub其中,“Index”是数组元素的下标。

VB键盘与鼠标事件过程

VB键盘与鼠标事件过程

VB键盘与鼠标事件过程在VB中,键盘和鼠标事件是通过事件处理程序来实现的。

事件处理程序是一段代码,当用户与应用程序的用户界面交互时,会触发这段代码。

下面将详细介绍VB中键盘和鼠标事件的过程。

键盘事件过程:1.事件注册:在VB中,要处理键盘事件,首先需要将事件与特定的控件关联起来。

可以通过在设计视图中选择控件,然后在属性窗口中选择“事件”选项卡来注册事件。

2.事件处理程序:在事件注册后,可以在代码视图中看到为该事件创建的事件处理程序。

事件处理程序是一个特定的过程或函数,当事件触发时,会执行这段代码。

可以在事件处理程序中编写逻辑代码来响应键盘事件。

3. 事件参数:在事件处理程序中,可以使用事件参数来获取有关事件的信息。

键盘事件参数通常包括键码(KeyCode)和修饰键(Shift、Ctrl、Alt等)。

通过使用这些参数,可以确定用户按下的是哪个键,并采取相应的操作。

4.事件处理:在事件处理程序中,可以根据需要执行特定的操作。

例如,可以根据用户按下的键,执行不同的操作或调用不同的函数。

可以使用条件语句(如If语句)来根据键码执行不同的逻辑。

5.事件冒泡:在VB中,键盘事件通常具有冒泡的特性。

这意味着,当用户在一个控件上按下键时,除了该控件的键盘事件被触发外,还会触发其父控件的键盘事件。

这样可以在不同层次的控件中处理键盘事件。

鼠标事件过程:1.事件注册:与键盘事件类似,要处理鼠标事件,首先需要将事件与特定的控件关联起来。

可以通过在设计视图中选择控件,然后在属性窗口中选择“事件”选项卡来注册事件。

2.事件处理程序:在事件注册后,可以在代码视图中看到为该事件创建的事件处理程序。

事件处理程序是一个特定的过程或函数,当事件触发时,会执行这段代码。

可以在事件处理程序中编写逻辑代码来响应鼠标事件。

3. 事件参数:在事件处理程序中,可以使用事件参数来获取有关事件的信息。

鼠标事件参数通常包括鼠标按钮(Button)和鼠标位置(X、Y 坐标)。

[最新]vb6全局键盘、鼠标钩子

[最新]vb6全局键盘、鼠标钩子

VB6全局键盘、鼠标钩子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, ByVal dwExtraInfo As Long)Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long'--------------------------------------'模拟按键Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)'鼠标钩子Public Function CallMouseHookProc(ByVal code As Long, ByVal wParam As Long, 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键替换为NIf 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=========================================================== ========。

用VB编写系统监视器

用VB编写系统监视器

用VB编写系统监视器编程专区2008-05-02 15:52:42 阅读95 评论0 字号:大中小订阅用VB编写系统监视器当你不在你的机器旁边时,你是否会担心有人在你的机器上运行了某些程序(给你的机器带来损坏)或有小孩子在你的电脑上"胡耍"。

你是否想到设计一个系统监视的程序,可以发现有人在你的机器上运行了哪些不当的程序,或当有小孩子在你的机器上玩游戏时,立刻强制关闭游戏。

读完了本文,你就可以着手去做了。

实现原理首先用Timer控件的ontimer来实现实时监控,接下来的问题是怎样去"检查"当前系统中有哪些程序在运行。

这个可以用findwindow这个API函数实现,如果发现被监视的程序已经运行就使用API 函数PostMessage 发送一个WM_CLOSE消息关闭它.程序实例下面给出一个实例,它是用VB 56. 编制而成的。

如果运行的是"扫雷"游戏,就强行关闭它,并发出警告。

具体程序如下;启动VB6.0新建一个标准工程,在窗体中添加两个CommandButton控伯和一个Timer控件如(图1 ).写下以下代码:Option ExplicitPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongConst WM_CLOSE = &H10Const WM_QUIT = &H12Dim Handle As IntegerDim n As IntegerPrivate Sub Command1_Click()Timer1.Interval = 1000Timer1.Enabled = Trueform1.hideEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_Load()Timer1.Enabled = FalsePrivate Sub Timer1_Timer()Dim hwnd As LongDim hlong As Longhwnd = FindWindow(vbNullString, "扫雷") '查找窗口标题为扫雷If hwnd <> 0 Then '如果窗口存在hlong = PostMessage(hwnd, WM_CLOSE, 0, 0) '发送关闭程序的消息End IfEnd Sub好了,一个简单的系统监视程序就做出来了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
hHook=SetWindowsHookEx(2,Address of MyKBHook,0,App.ThreadID)
End Sub
′具体的钩子程序,本例中该过程被包含在Module1中
Public Function MyKBHook(ByVal nCode As Long,ByVal wParam As Long,ByVal lParam As Long)As Long
If nCode>=0 then
Open "C:\Keyfile.txt" For Append As #1 '将键盘的操作记录在Keyfile.txt文件之中
'记录所操作的键、操作时间、日期操作时的按键状态,用16进制记录
Write #1,wParam,Hex(lParam),Date,time
键盘:
A:在Timer控件中不断使用GetAsyncKeyState取得按键信息
B:使用Hook。
如果是普通键盘钩子(WH_KEYBOARD),系统级的需要将回掉函数放在dll中,但VB不能写普通dll(不能是VB的ActiveX DLL),需要用其他编程工具写(如VC++、Delphi、Borland C++ Builder)
B:使用Hook。
如果是鼠标键盘钩子(WH_MOUSE),系统级的需要将回掉函数放在dll中,但VB不能写普通dll(不能是VB的ActiveX DLL),需要用其他编程工具写(如VC++、Delphi、Borland C++ Builder)
如果是鼠标键盘钩子(WH_MOUSE_LL),则本身就是系统级的,不需要dll,但只能在NT系统(WinNT4/2000/XP/2003)下使用
'程序退出时卸载钩子
Private Sub Form_Unload(Cancel As Interger)
Call Unhook WindowsHookEx(hHook)
End Sub
鼠标:
A:在Timer控件中不断使用GetCursor取得鼠标的位置
如果是底层键盘钩子(WH_KEYBOARD_LL),则本身就是系统级的,不需要dll,但只能在NT系统(WinNT4/2000/XP/2003)下使用 Biblioteka GetCursorPos
VB声明
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
MyHBHook=1 '钩子吃掉这个消息
End if
End if
End if
Call CallNextHookEx(hHook,nCode,wParam,lParam)'将消息传给下一个钩子
End Function
Close #1
MyKBHook=0 '表示要处理这个消息
'屏蔽ALT+F4组合键
if wParam=115 And(lParam And&H20000000)<>0 Then
if(lParam And &HC000000)=0 Then '是否进行ALT+F4操作
说明
判断函数调用时指定虚拟键的状态
返回值
Long,自对GetAsyncKeyState函数的上一次调用以来,如键已被按过,则位0设为1;否则设为0。如键目前处于按下状态,则位15设为1;如抬起,则为0。微软的win32手册指出:倘若输入焦点从属于与调用函数的输入线程不同的另一个输入线程,则返回值为0(例如,一旦另一个程序拥有焦点,则它应返回零)。证据显示,函数实际是在整个系统的范围内工作的
在VB中如何用API监控鼠标和键盘
本例中的钩子用来监视并记录应用程序中的按键信息。在程序中,ALT+F4组合键被屏蔽。下面是部分代码:
Public hHook as Long
Private Sub Form_Load()′程序启动时安装钩子
标准的作法还是使用全局底层钩子。
如zyl910所说,对于鼠标和键盘,分别对应一个底层钩子。
说明
获取鼠标指针的当前位置
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpPoint POINTAPI,随同指针在屏幕像素坐标中的位置载入的一个结构
GetAsyncKeyState
VB声明
Declare Function GetAsyncKeyState Lib "user32" Alias "GetAsyncKeyState" (ByVal vKey As Long) As Integer
参数表
参数 类型及说明
vKey Long,欲测试的虚拟键的键码
注解
如指定了VK_LBUTTON 或 VK_RBUTTON,按钮的状态就会根据实际的按钮报告——无论是否曾用SwapMouseButton函数对鼠标的位置进行了交换。win32提供了额外的一些虚拟键码,比如VK_LSHIFT 和 VK_RSHIFT,以便在两个完全一样的键中区分出左右(也包括Ctrl 和 Alt)
相关文档
最新文档