本文目录导读:

- Python(跨平台)
- AutoHotkey(Windows)
- PowerShell(Windows)
- C++(Windows API)
- 命令行工具(Windows)
- JavaScript(浏览器环境)
- 实用场景代码
- 注意事项
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)
使用 SysInternals 的 pslist 或 lastactivity
@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
注意事项
- 权限问题:某些系统环境(如macOS)请求输入监听权限
- 性能影响:高频轮询可能影响系统性能,建议使用事件驱动
- 隐私考量:请确保符合法律法规和用户协议
- 跨平台差异:pynput支持Windows/Linux/macOS,AutoHotkey仅Windows
选择哪种方式取决于你的具体需求(Windows应用/游戏脚本/系统监控等)。