返回

Windows 自动执行鼠标点击: 计划任务与 PowerShell 脚本

windows

Windows 环境下使用脚本/批处理文件自动执行鼠标点击

用户需要脚本能在每天凌晨 0:00 至 5:00 期间、且在没有网络连接的情况下,自动执行一次鼠标左键单击。该操作每隔15分钟重复执行。要实现这些需求,可以尝试不同的解决方案。

方案概述

批处理文件在处理时间条件和网络连接方面能力相对有限。VBScript、PowerShell 是更好的选择。结合这几类脚本可以实现最终效果。可以把实现用户需求的方案,概括为两种主要方式:

  1. 使用计划任务触发辅助脚本: 核心逻辑仍然依靠批处理文件来完成。用 VBScript 或 PowerShell 脚本模拟鼠标点击。Windows 的计划任务在每天的 0:00 执行批处理文件,进行循环操作。
  2. 完全使用 PowerShell 脚本: 只用 PowerShell 来处理所有的逻辑和条件,包括时间、网络连接状态以及控制鼠标点击。

使用计划任务触发辅助脚本的实现方案

此方法分为几个步骤:创建执行主要检查的批处理文件、编写执行鼠标点击的 VBScript 或 PowerShell 脚本、设定计划任务。

1. 创建执行鼠标点击的脚本

VBScript 实现

新建一个文本文件,将文件后缀名修改为 .vbs

Set objShell = CreateObject("WScript.Shell")
objShell.SendKeys("{LEFT}")

该脚本模拟按下鼠标左键的操作。VBScript 的 SendKeys 方法将键击发送到活动窗口,但这种方法只能在指定的坐标点击。可以通过引入一些系统级别的函数来实现点击任意坐标,以下是另一个VBS的例子,但只能工作在x86平台上。

Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As LongPtr
Declare PtrSafe Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As LongPtr)

' 常量定义
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4

' 获取鼠标位置并执行点击
Dim X As Long
Dim Y As Long
' 获取鼠标当前位置
GetCursorPos X, Y
SetCursorPos X, Y

' 模拟左键点击
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

PowerShell 实现

新建一个文本文件,后缀名更改为 .ps1

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(100,100)

Add-Type @'
    using System;
    using System.Runtime.InteropServices;

    public class MouseClicker {
        [DllImport("user32.dll")]
        public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);

        public const uint MOUSEEVENTF_LEFTDOWN = 0x02;
        public const uint MOUSEEVENTF_LEFTUP = 0x04;
    }
'@

[MouseClicker]::mouse_event([MouseClicker]::MOUSEEVENTF_LEFTDOWN, 0, 0, 0, [UIntPtr]::Zero)
Start-Sleep -Milliseconds 100
[MouseClicker]::mouse_event([MouseClicker]::MOUSEEVENTF_LEFTUP, 0, 0, 0, [UIntPtr]::Zero)

Add-Type -AssemblyName System.Windows.Forms用来载入相关的 .NET 程序集,通过 Windows API 进行点击模拟,可以灵活地指定点击坐标。通过设定[System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(100,100) 可以将点击设置在(100,100)的坐标位置。而后续的一系列mouse_event调用,则完成具体的点击操作。这段脚本在运行时需要一定的权限。确保脚本以适当的权限执行,以防止安全问题。

2. 编写批处理文件

批处理文件协调时间检查、网络连接检查,并根据情况调用鼠标点击脚本。

@echo off
:loop
REM 检查时间是否在 00:00 到 05:00 之间
time /t | findstr /i /r /c:"^[0-4]" >nul
if errorlevel 1 (
    echo 时间不在指定范围内,等待 15 分钟...
    timeout /t 900 /nobreak >nul
    goto loop
)

REM 检查网络连接
ping -n 1 8.8.8.8 | findstr /i "TTL=" >nul
if errorlevel 1 (
    echo 没有网络连接,执行鼠标点击...
    REM 更改路径以符合您环境中实际的文件路径
    REM 使用PowerShell
    powershell.exe -ExecutionPolicy Bypass -File "C:\path\to\click.ps1"

    REM 使用VBScript
    REM cscript "C:\path\to\click.vbs"
) else (
    echo 检测到网络连接,等待 15 分钟...
)

timeout /t 900 /nobreak >nul
goto loop

在这个批处理脚本中,使用time /t 检查时间。网络连接检查使用的是ping命令,通过查看返回值确认网络连接。如果没有网络连接,则通过powershell.exe调用之前创建的 PowerShell 脚本来模拟鼠标点击。timeout用于每隔15分钟执行。确保该脚本在运行时处于非管理员状态。防止潜在的风险。

3. 设置计划任务

计划任务用于每日特定时间触发该批处理文件。操作步骤如下:

  1. 打开任务计划程序(Task Scheduler)。
  2. 点击“创建基本任务...”(Create Basic Task)。
  3. 为任务命名,点击“下一步”(Next)。
  4. 选择“每天”(Daily),点击“下一步”。
  5. 设置开始时间为 00:00,点击“下一步”。
  6. 选择“启动程序”(Start a program),点击“下一步”。
  7. 填写程序或脚本路径,指向所创建的批处理文件,点击“下一步”。
  8. 点击“完成”(Finish)。

设定计划任务运行脚本。务必对脚本进行彻底的测试,防止潜在风险。

使用 PowerShell 脚本的实现方案

此方法涉及到一个结合时间检查、网络状态监控和模拟鼠标点击操作的完整 PowerShell 脚本。它省去了对批处理文件的需要。以下为操作步骤和相应的代码:

编写完整的 PowerShell 脚本

此脚本执行所有必要的检查并执行鼠标点击。

while ($true) {
    $currentTime = Get-Date

    # 检查时间是否在 0:00 到 5:00 之间
    if ($currentTime.Hour -ge 0 -and $currentTime.Hour -lt 5) {

        # 检查网络连接
        $testConnection = Test-Connection -ComputerName 8.8.8.8 -Quiet -Count 1

        if (-not $testConnection) {
            Write-Host "无网络连接,进行鼠标点击"

            # 进行鼠标点击操作的实现
            Add-Type -AssemblyName System.Windows.Forms
            [System.Windows.Forms.Cursor]::Position = New-Object System.Drawing.Point(100,100)

            Add-Type @'
                using System;
                using System.Runtime.InteropServices;

                public class MouseClicker {
                    [DllImport("user32.dll")]
                    public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, UIntPtr dwExtraInfo);

                    public const uint MOUSEEVENTF_LEFTDOWN = 0x02;
                    public const uint MOUSEEVENTF_LEFTUP = 0x04;
                }
'@
            [MouseClicker]::mouse_event([MouseClicker]::MOUSEEVENTF_LEFTDOWN, 0, 0, 0, [UIntPtr]::Zero)
            Start-Sleep -Milliseconds 100
            [MouseClicker]::mouse_event([MouseClicker]::MOUSEEVENTF_LEFTUP, 0, 0, 0, [UIntPtr]::Zero)

        } else {
            Write-Host "已连接至互联网,继续监控。"
        }

    } else {
        Write-Host "非指定时间,继续监控。"
    }

    Start-Sleep -Seconds 900 # 等待 15 分钟 (900 秒)
}
  • 此脚本不断循环,在执行循环的过程中检查当前时间是否属于预定区间(0:00 至 5:00)。

  • Test-Connection用于检查到 8.8.8.8 的连接。返回值为$true代表已连接网络,否则代表断网。Count 1使命令更高效地执行。

  • 如果互联网连接断开,脚本调用前面提供的代码来执行鼠标单击。

  • Start-Sleep让脚本每 15 分钟运行一次。

  • 使用Write-Host输出当前脚本运行信息。便于进行运行状态确认。

结语

通过结合使用 Windows 环境下的不同脚本,可以灵活地实现在指定时间和网络连接状态条件下触发鼠标自动点击的功能。每种方案都依赖于各自的技术特性和实现方法。通过合理配置和应用,可以更好地提升工作效率。选择何种方案进行实际操作需要基于使用场景。对这些脚本进行运行测试是必不可少的。这几种方式各有优劣,从灵活性、便捷性而言,完全采用PowerShell脚本的方式略胜一筹。在进行相关的测试与使用时,用户需要注意权限问题。防止产生额外风险。