Elimina main.py y sus referencias

Se retira la implementación en Python; Mover.ps1 queda como única
implementación. Se actualizan README, AGENTS, CHANGELOG, TODO,
.gitattributes y .gitignore.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
sargatxetandCopilot App committed 2026-10-07 08:40:57 +02:00
1 parent 5ecdde187e
commit 5d940a741a
7 files changed
+4 -106

No files matched your search

-1
View File
@@ -1,4 +1,3 @@
* text=auto
*.ps1 text eol=crlf
*.md text eol=crlf
*.py text eol=lf
-2
View File
@@ -1,3 +1 @@
__pycache__/
*.pyc
*.lnk
+2 -5
View File
@@ -7,14 +7,13 @@ Guía para agentes de IA y colaboradores que trabajen en este repositorio.
Utilidad para Windows que mueve el puntero del ratón solo tras un periodo de inactividad del
usuario y se detiene al detectar uso real. Ver `README.md`.
- `Mover.ps1`: implementación principal (PowerShell + C# embebido con `Add-Type`).
- `main.py`: implementación original en Python (`pyautogui`), mantenida como referencia.
- `Mover.ps1`: implementación (PowerShell + C# embebido con `Add-Type`).
## Normas
- Idioma: comentarios, documentación y mensajes en **castellano**.
- Toda función nueva debe llevar documentación (`<# .SYNOPSIS #>` en PowerShell,
`/// <summary>` en C#, docstrings en Python). Actualizar la documentación al modificarlas.
`/// <summary>` en C#). Actualizar la documentación al modificarlas.
- No modificar ficheros sin autorización previa del usuario.
- Registrar los cambios en `CHANGELOG.md` y las tareas pendientes en `TODO.md`.
@@ -39,6 +38,4 @@ usuario y se detiene al detectar uso real. Ver `README.md`.
$err=$null; [System.Management.Automation.Language.Parser]::ParseFile('Mover.ps1',[ref]$null,[ref]$err) | Out-Null; $err.Count
# Prueba funcional rápida
powershell -ExecutionPolicy Bypass -File .\Mover.ps1 -TiempoInactividad 10
# Python
python -m py_compile main.py
```
-10
View File
@@ -15,13 +15,3 @@ El formato se basa en [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/
- Mensajes con hora al iniciar y detener el movimiento.
- Cierre automático de instancias anteriores al arrancar.
- Documentación: `README.md`, `AGENTS.md`, `CHANGELOG.md` y `TODO.md`.
### Cambiado
- `main.py`: el movimiento solo se activa tras 3 minutos de inactividad y se detiene al
detectar uso del usuario. Se sustituye `except:` por `except Exception` para permitir
detenerlo con `Ctrl+C`.
## [0.1.0]
### Añadido
- `main.py`: versión inicial que movía el ratón aleatoriamente de forma continua.
+2 -4
View File
@@ -8,14 +8,12 @@ En cuanto se detecta uso real, el movimiento se detiene y se vuelve a esperar.
| Fichero | Descripción |
|--------------|-------------|
| `Mover.ps1` | Implementación principal en PowerShell. Sin dependencias externas. |
| `main.py` | Implementación original en Python (requiere `pyautogui`). Funcionalidad básica, sin animación. |
| `Mover.ps1` | Implementación en PowerShell. Sin dependencias externas. |
## Requisitos
- Windows (usa las APIs `user32`/`kernel32`).
- `Mover.ps1`: Windows PowerShell 5.1 o PowerShell 7.
- `main.py`: Python 3 y `pip install pyautogui`.
- Windows PowerShell 5.1 o PowerShell 7.
## Uso de `Mover.ps1`
-2
View File
@@ -2,8 +2,6 @@
## Pendiente
- [ ] Igualar `main.py` con `Mover.ps1` (deslizamiento animado, cierre de instancias previas,
mensajes) o retirarlo si deja de usarse.
- [ ] Añadir un icono en la bandeja del sistema para pausar/salir sin abrir la consola.
- [ ] Opción para impedir la suspensión con `SetThreadExecutionState` sin mover el puntero.
- [ ] Registro opcional en fichero de los periodos de actividad/inactividad.
-82
View File
@@ -1,82 +0,0 @@
"""Mueve el ratón aleatoriamente solo tras un periodo de inactividad del usuario (solo Windows)."""
import ctypes
import ctypes.wintypes
import random
import time
import pyautogui
# Segundos sin uso de teclado/ratón antes de empezar a mover el cursor
TIEMPO_INACTIVIDAD = 180
# Desplazamiento máximo (píxeles) en cada eje
DESPLAZAMIENTO_MAX = 50
# Intervalo de comprobación de actividad (segundos)
INTERVALO_COMPROBACION = 0.2
class LASTINPUTINFO(ctypes.Structure):
"""Estructura de Win32 que recibe el instante de la última entrada del usuario."""
_fields_ = [("cbSize", ctypes.wintypes.UINT), ("dwTime", ctypes.wintypes.DWORD)]
def obtener_ultima_entrada():
"""
Obtiene el instante (en ticks del sistema, ms) de la última entrada de teclado o ratón.
:return: valor dwTime devuelto por GetLastInputInfo.
"""
info = LASTINPUTINFO()
info.cbSize = ctypes.sizeof(LASTINPUTINFO)
if not ctypes.windll.user32.GetLastInputInfo(ctypes.byref(info)):
raise ctypes.WinError()
return info.dwTime
def segundos_inactivo():
"""
Calcula los segundos transcurridos desde la última entrada de teclado o ratón.
:return: segundos de inactividad.
"""
ahora = ctypes.windll.kernel32.GetTickCount() & 0xFFFFFFFF
# Máscara para tolerar el desbordamiento de GetTickCount (~49,7 días)
return ((ahora - obtener_ultima_entrada()) & 0xFFFFFFFF) / 1000.0
def esperar_inactividad():
"""Bloquea hasta que el usuario lleve TIEMPO_INACTIVIDAD segundos sin usar teclado ni ratón."""
while segundos_inactivo() < TIEMPO_INACTIVIDAD:
time.sleep(1)
def mover_mientras_inactivo():
"""
Mueve el ratón aleatoriamente hasta detectar actividad real del usuario.
Los movimientos propios también actualizan GetLastInputInfo, por lo que tras cada
movimiento se guarda el dwTime resultante; cualquier cambio posterior indica uso real.
"""
while True:
pyautogui.moveRel(random.randrange(-DESPLAZAMIENTO_MAX, DESPLAZAMIENTO_MAX),
random.randrange(-DESPLAZAMIENTO_MAX, DESPLAZAMIENTO_MAX))
ultima_propia = obtener_ultima_entrada()
fin_pausa = time.monotonic() + random.randrange(2, 5)
while time.monotonic() < fin_pausa:
time.sleep(INTERVALO_COMPROBACION)
if obtener_ultima_entrada() != ultima_propia:
return
def main():
"""Bucle principal: espera la inactividad, mueve el ratón y se detiene al detectar uso."""
while True:
try:
esperar_inactividad()
mover_mientras_inactivo()
except Exception:
time.sleep(1)
if __name__ == "__main__":
main()