脚本如何检测键盘鼠标活动

wen 实用脚本 2

本文目录导读:

脚本如何检测键盘鼠标活动

  1. Python(跨平台)
  2. AutoHotkey(Windows)
  3. PowerShell(Windows)
  4. C++(Windows API)
  5. 命令行工具(Windows)
  6. JavaScript(浏览器环境)
  7. 实用场景代码
  8. 注意事项

Python(跨平台)

使用 pynput 库(推荐)

from pynput import mouse, keyboard
import time
# 鼠标监听
def on_move(x, y):
    print(f"鼠标移动至 ({x}, {y})")
def on_click(x, y, button, pressed):
    print(f"鼠标{'按下' if pressed else '释放'} {button} 在 ({x}, {y})")
# 键盘监听
def on_press(key):
    try:
        print(f"按下键: {key.char}")
    except AttributeError:
        print(f"特殊键: {key}")
def on_release(key):
    print(f"释放键: {key}")
    if key == keyboard.Key.esc:
        return False  # 停止监听
# 启动监听(非阻塞)
mouse_listener = mouse.Listener(on_move=on_move, on_click=on_click)
keyboard_listener = keyboard.Listener(on_press=on_press, on_release=on_release)
mouse_listener.start()
keyboard_listener.start()
# 保持程序运行
mouse_listener.join()
keyboard_listener.join()

检测空闲时间

import time
from pynput import mouse, keyboard
last_activity_time = time.time()
def activity_detected():
    global last_activity_time
    last_activity_time = time.time()
# 监听所有活动
mouse.Listener(on_move=activity_detected, on_click=activity_detected).start()
keyboard.Listener(on_press=activity_detected).start()
while True:
    idle_time = time.time() - last_activity_time
    print(f"空闲时间: {idle_time:.1f}秒")
    time.sleep(1)

AutoHotkey(Windows)

检测键盘输入

#Persistent
SetTimer, CheckActivity, 1000  ; 每秒检查一次
CheckActivity:
    if (A_TimeIdleKeyboard > 5000)  ; 5秒无键盘输入
        ToolTip, 键盘已空闲 %A_TimeIdleKeyboard% 毫秒
    else
        ToolTip, 键盘活跃中
return

检测鼠标活动

#Persistent
SetTimer, CheckMouse, 100
CheckMouse:
    ; 检测鼠标移动
    MouseGetPos, x, y
    static lastX, lastY
    if (x != lastX || y != lastY) {
        ToolTip, 鼠标移动至 (%x%, %y%)
        lastX := x, lastY := y
    }
return

通用活动检测

#Persistent
SetTimer, CheckActivity, 500
CheckActivity:
    idletime := A_TimeIdlePhysical
    if (idletime > 10000)  ; 10秒无任何活动
        ToolTip, 系统空闲中 (%idletime% ms)
    else
        ToolTip, 用户活跃中
return

PowerShell(Windows)

使用 .NET 方法(后台运行)

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class ActivityChecker {
    [DllImport("user32.dll")]
    public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
    [StructLayout(LayoutKind.Sequential)]
    public struct LASTINPUTINFO {
        public uint cbSize;
        public uint dwTime;
    }
    public static uint GetIdleTime() {
        LASTINPUTINFO lastInput = new LASTINPUTINFO();
        lastInput.cbSize = (uint)Marshal.SizeOf(lastInput);
        GetLastInputInfo(ref lastInput);
        return ((uint)Environment.TickCount - lastInput.dwTime);
    }
}
"@
while ($true) {
    $idleTime = [ActivityChecker]::GetIdleTime()
    Write-Host "空闲时间: $($idleTime/1000)秒"
    Start-Sleep -Seconds 1
}

C++(Windows API)

直接调用 Windows API

#include <windows.h>
#include <iostream>
int main() {
    LASTINPUTINFO lii;
    lii.cbSize = sizeof(LASTINPUTINFO);
    while (true) {
        if (GetLastInputInfo(&lii)) {
            DWORD idleTime = GetTickCount() - lii.dwTime;
            std::cout << "空闲时间: " << idleTime/1000 << "秒" << std::endl;
        }
        Sleep(1000);
    }
    return 0;
}

命令行工具(Windows)

使用 SysInternalspslistlastactivity

@echo off
:loop
for /f "tokens=2 delims==" %%a in ('wmic path Win32_PerfFormattedData_PerfOS_System get SystemUpTime /value') do set idletime=%%a
echo 系统运行时间: %idletime%秒
timeout /t 1 /nobreak >nul
goto loop

JavaScript(浏览器环境)

检测用户活动

let lastActivity = Date.now();
document.addEventListener('mousemove', () => lastActivity = Date.now());
document.addEventListener('keydown', () => lastActivity = Date.now());
setInterval(() => {
    const idleTime = (Date.now() - lastActivity) / 1000;
    console.log(`用户空闲: ${idleTime}秒`);
}, 1000);

实用场景代码

Python:检测并记录活动日志

from pynput import mouse, keyboard
from datetime import datetime
import json
events = []
def on_activity(event_type, detail):
    events.append({
        'time': datetime.now().isoformat(),
        'type': event_type,
        'detail': str(detail)
    })
    # 保存到文件
    if len(events) >= 10:
        with open('activity_log.json', 'a') as f:
            json.dump(events, f)
            f.write('\n')
        events.clear()
# 启动监听
mouse.Listener(on_move=lambda x,y: on_activity('mouse_move', (x,y)),
               on_click=lambda x,y,b,p: on_activity('mouse_click', (x,y,b,p))).start()
keyboard.Listener(on_press=lambda k: on_activity('key_press', k)).start()
input("监听中...按Enter停止")

AutoHotkey:空闲时自动锁定

#Persistent
SetTimer, CheckIdle, 5000  ; 每5秒检查
CheckIdle:
    if (A_TimeIdlePhysical > 300000) {  ; 5分钟无活动
        DllCall("LockWorkStation")  ; 锁定电脑
        SoundBeep, 1000, 500
    }
return

注意事项

  1. 权限问题:某些系统环境(如macOS)请求输入监听权限
  2. 性能影响:高频轮询可能影响系统性能,建议使用事件驱动
  3. 隐私考量:请确保符合法律法规和用户协议
  4. 跨平台差异:pynput支持Windows/Linux/macOS,AutoHotkey仅Windows

选择哪种方式取决于你的具体需求(Windows应用/游戏脚本/系统监控等)。

抱歉,评论功能暂时关闭!