用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击)

网上搜到的答案普遍是VBS无法实现,或者是要用第三方COM(ActiveX?)组件。我对第三方组件是很反感的,使用第三方组件毫无可移植性可言,因为别人的系统中不一定注册了这个组件。我的建议是,尽量不要在VBS代码中调用第三方组件,除非你的程序只是写来自己用。(顺便说一下,也尽量不要用不靠谱的Sendkeys方法,原因不解释)

好了,废话就说这么多,现在说说用VBS控制鼠标的方法。我以前写过一篇《VBS调用Windows
API函数》,本以为既然都能调用API了,用VBS控制鼠标还不是很简单是事?事实证明我错了,不明真相的同学永远是大多数,不知道API是什么的VBSer大有人在。不贴出实实在在的代码,他们根本不会自己写!

使用此代码的前提是你的系统上安装了Excel,因为要用到Excel.Application对象(如果你偏要认为这算第三方组件我也没话说):

复制代码
代码如下:

Option Explicit

Dim WshShell

Dim oExcel, oBook, oModule
Dim strRegKey, strCode, x, y
Set oExcel =
CreateObject("Excel.Application") ‘创建 Excel 对象

set WshShell =
CreateObject("wscript.Shell")

strRegKey =
"HKEY_CURRENT_USER\Software\Microsoft\Office\$\Excel\Security\AccessVBOM"

strRegKey = Replace(strRegKey, "$", oExcel.Version)

WshShell.RegWrite strRegKey, 1, "REG_DWORD"

Set oBook =
oExcel.Workbooks.Add ‘添加工作簿
Set oModule =
obook.VBProject.VBComponents.Add(1) ‘添加模块
strCode = _

"‘Author:
Demon" & vbCrLf & _
"‘Website: http://demon.tw" & vbCrLf & _

"‘Date: 2011/5/10" & vbCrLf & _

"Private Type POINTAPI : X
As Long : Y As Long : End Type" & vbCrLf & _
"Private Declare
Function SetCursorPos Lib ""user32"" (ByVal x As Long, ByVal y As Long) As Long"
& vbCrLf & _

"Private Declare Function GetCursorPos Lib
""user32"" (lpPoint As POINTAPI) As Long" & vbCrLf & _
"Private
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)" & vbCrLf & _

"Public Function
GetXCursorPos() As Long" & vbCrLf & _
"Dim pt As POINTAPI :
GetCursorPos pt : GetXCursorPos = pt.X" & vbCrLf & _
"End Function"
& vbCrLf & _

"Public Function GetYCursorPos() As Long" &
vbCrLf & _
"Dim pt As POINTAPI: GetCursorPos pt : GetYCursorPos = pt.Y"
& vbCrLf & _
"End Function"

oModule.CodeModule.AddFromString
strCode ‘在模块中添加 VBA 代码
‘Author: Demon
‘Website: http://demon.tw

‘Date: 2011/5/10
x = oExcel.Run("GetXCursorPos") ‘获取鼠标 X 坐标
y =
oExcel.Run("GetYCursorPos") ‘获取鼠标 Y 坐标

WScript.Echo x, y
oExcel.Run
"SetCursorPos", 30, 30 ‘设置鼠标 X Y 坐标
Const MOUSEEVENTF_MOVE = &H1

Const MOUSEEVENTF_LEFTDOWN = &H2

Const MOUSEEVENTF_LEFTUP =
&H4
Const MOUSEEVENTF_RIGHTDOWN = &H8
Const MOUSEEVENTF_RIGHTUP
= &H10
Const MOUSEEVENTF_MIDDLEDOWN = &H20
Const
MOUSEEVENTF_MIDDLEUP = &H40

Const MOUSEEVENTF_ABSOLUTE = &H8000

‘模拟鼠标左键单击
oExcel.Run "mouse_event", MOUSEEVENTF_LEFTDOWN +
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

‘模拟鼠标左键双击(即快速的两次单击)
oExcel.Run
"mouse_event", MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

oExcel.Run "mouse_event", MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, 0, 0,
0, 0

‘模拟鼠标右键单击
oExcel.Run "mouse_event", MOUSEEVENTF_RIGHTDOWN +
MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0
‘模拟鼠标中键单击
oExcel.Run "mouse_event",
MOUSEEVENTF_MIDDLEDOWN + MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0

‘关闭 Excel

oExcel.DisplayAlerts = False
oBook.Close
oExcel.Quit

注释已经够详细了,要知道我很少写注释的,如果还看不懂,说明你的水平有待提高!

原文:http://demon.tw/programming/vbs-control-mouse.html

用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击)

时间: 2024-10-29 19:06:36

用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击)的相关文章

用VBS控制鼠标(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击)

Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog  ?  程序设计  ?  用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) ? bbPress积分插件--Virtual Money VBS调用WMI监视注册表变动 ? 用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) 标题: 用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击)作者: Demon链接: http://demon.tw/programm

用VBS控制鼠标,在Excel2010、2013,64位中

原作者文章地址:http://demon.tw/programming/vbs-control-mouse.html 感谢原作者的攻略.才使我学会用VBS控制鼠标. 但是问题接踵而至,Excel2003和Excel2007环境下,按文章做全然没问题. 但是Excel2010和Excel2013无法使用.会弹出窗体: 错误:无法执行"SetCursorPos"宏. 可能是由于该宏在此工作薄中不可用.或者全部的宏都被禁用. 代码:800A03EC 解决方法: 在宏设置中启用全部宏:在自己定

VBS控制鼠标移动和点击(附源代码下载)

森思:想用vbs来控制鼠标的移动和点击,虽然按键精灵可以做到,但做这么简单的事情不想启动那么大一个程序,所以自己用VC写了一个小程序,可以让VBS来控制鼠标移动和点击. 用法: 移动鼠标到桌面坐标200,50的vbs命令如下: CreateObject("WScript.Shell").Run "mouse.exe m,200,50" 点击鼠标左键的vbs命令如下: CreateObject("WScript.Shell").Run "

鼠标消息的位置获取正确方式

今天碰到一个问题,就是在多屏的时候,WM_NCHITTEST结果不正确,经检查发现在多屏的情况下,鼠标的位置是有可能出现负值的,但是如果还是用LoWord(Msg.LParam)和HiWORD(Msg.LParam)取鼠标的位置,就会取出不正确的值,因为这两个函数只会返回正值. 查询MSDN的WM_NCHITTEST有下面一段话. Remarks Use the following code to obtain the horizontal and vertical position: xPos

百度地图实现鼠标绘制多边形并获取所有点坐标

百度地图开放平台http://lbsyun.baidu.com/ 这里使用的是Javascript API http://lbsyun.baidu.com/index.php?title=jspopular 实现鼠标绘制多边形主要用到百度地图JavaScript开源库鼠标绘制工具条库(http://lbsyun.baidu.com/index.php?title=open/library),提供鼠标绘制点.线.面.多边形(矩形.圆)的编辑工具条的开源代码库.且用户可使用JavaScript AP

百度地图地点搜索和鼠标点击地点获取经纬度

百度地图地点搜索和鼠标点击地点获取经纬度,这些都是地图比较基本 效果图:如下 代码部分: <!DOCTYPE html><html>    <head>    <meta charset="utf-8">    <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

JavaScript-4.6鼠标事件监听,获取鼠标坐标window.event---ShinePans

<html> <head> <meta http-equiv="content-type" content="text/html" charset=GB2312"/> <title> 4.5 window.event应用 </title> <script> function body_onclick(){ alert("鼠标点击的坐标是\r\nx:"+event.x

神奇的Grails:自关联的树状Domain一行代码获取所有子节点

见证Groovy/Grails的神奇时刻到了,你相信吗?用一行代码就可以获取树状结构中某节点下的所有全部子节点!注意:这个树是无深度限制的.无深度限制这点很重要,如果有限深度的树,那我们也很容易通过层级编码用“Like 001%”方式实现(维护编码也是一个有挑战性活).我们以一个非常常见的“类别”Domain为例,大类分小类,小类再细分,典型的树形结构,看看Grails是如何以简洁的语法表达的,体验Groovy语法的神奇! class Group{ String name static hasM

java I/O进程控制,重定向 示例代码

package org.rui.io.util; import java.io.*; /** * 标准I/O重定向 */ public class Redircting { public static void main(String[] args) throws IOException { String path="D:\\Users\\liangrui\\workspace\\thinking\\src\\org\\rui\\io\\util/"; PrintStream cons