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:
1 parent
5ecdde187e
commit
5d940a741a
7 files changed
+4
-106
No files matched your search
@@ -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
|
|
||||||
@@ -1,3 +1 @@
|
|||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
*.lnk
|
*.lnk
|
||||||
@@ -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
|
|
||||||
```
|
```
|
||||||
@@ -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.
|
|
||||||
@@ -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,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.
|
||||||
|
|||||||
@@ -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()
|
|
||||||
Reference in new issue
Block a user