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 * text=auto
*.ps1 text eol=crlf *.ps1 text eol=crlf
*.md text eol=crlf *.md text eol=crlf
*.py text eol=lf
-2
View File
@@ -1,3 +1 @@
__pycache__/
*.pyc
*.lnk *.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 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`. usuario y se detiene al detectar uso real. Ver `README.md`.
- `Mover.ps1`: implementación principal (PowerShell + C# embebido con `Add-Type`). - `Mover.ps1`: implementación (PowerShell + C# embebido con `Add-Type`).
- `main.py`: implementación original en Python (`pyautogui`), mantenida como referencia.
## Normas ## Normas
- Idioma: comentarios, documentación y mensajes en **castellano**. - Idioma: comentarios, documentación y mensajes en **castellano**.
- Toda función nueva debe llevar documentación (`<# .SYNOPSIS #>` en PowerShell, - 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. - No modificar ficheros sin autorización previa del usuario.
- Registrar los cambios en `CHANGELOG.md` y las tareas pendientes en `TODO.md`. - 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 $err=$null; [System.Management.Automation.Language.Parser]::ParseFile('Mover.ps1',[ref]$null,[ref]$err) | Out-Null; $err.Count
# Prueba funcional rápida # Prueba funcional rápida
powershell -ExecutionPolicy Bypass -File .\Mover.ps1 -TiempoInactividad 10 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. - Mensajes con hora al iniciar y detener el movimiento.
- Cierre automático de instancias anteriores al arrancar. - Cierre automático de instancias anteriores al arrancar.
- Documentación: `README.md`, `AGENTS.md`, `CHANGELOG.md` y `TODO.md`. - 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 | | Fichero | Descripción |
|--------------|-------------| |--------------|-------------|
| `Mover.ps1` | Implementación principal en PowerShell. Sin dependencias externas. | | `Mover.ps1` | Implementación en PowerShell. Sin dependencias externas. |
| `main.py` | Implementación original en Python (requiere `pyautogui`). Funcionalidad básica, sin animación. |
## Requisitos ## Requisitos
- Windows (usa las APIs `user32`/`kernel32`). - Windows (usa las APIs `user32`/`kernel32`).
- `Mover.ps1`: Windows PowerShell 5.1 o PowerShell 7. - Windows PowerShell 5.1 o PowerShell 7.
- `main.py`: Python 3 y `pip install pyautogui`.
## Uso de `Mover.ps1` ## Uso de `Mover.ps1`
-2
View File
@@ -2,8 +2,6 @@
## Pendiente ## 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. - [ ] 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. - [ ] Opción para impedir la suspensión con `SetThreadExecutionState` sin mover el puntero.
- [ ] Registro opcional en fichero de los periodos de actividad/inactividad. - [ ] 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()