Yo quería hacer algo parecido.
Probé el freeware Caffeine pero estaba bloqueado por nuestras políticas de IT. Terminé escribiendo un script en Python que hace algo similar (enviando la pulsación F15 cada xx segundos).
(Definitivamente puede ser recortado a un mínimo de líneas, pero sólo tengo 15 minutos de sobra en él, así que la primera parte es un gran copia-pega de otro código).
Aquí está:
#!/python
import ctypes
import random
import re
import time
from argparse import ArgumentParser, HelpFormatter
LONG = ctypes.c_long
DWORD = ctypes.c_ulong
ULONG_PTR = ctypes.POINTER(DWORD)
WORD = ctypes.c_ushort
class MOUSEINPUT(ctypes.Structure):
_fields_ = (
('dx', LONG), ('dy', LONG), ('mouseData', DWORD),
('dwFlags', DWORD), ('time', DWORD),
('dwExtraInfo', ULONG_PTR)
)
class KEYBDINPUT(ctypes.Structure):
_fields_ = (
('wVk', WORD), ('wScan', WORD),
('dwFlags', DWORD), ('time', DWORD),
('dwExtraInfo', ULONG_PTR)
)
class _INPUTunion(ctypes.Union):
_fields_ = (
('mi', MOUSEINPUT),
('ki', KEYBDINPUT)
)
class INPUT(ctypes.Structure):
_fields_ = (('type', DWORD), ('union', _INPUTunion))
def SendInput(*inputs):
nInputs = len(inputs)
LPINPUT = INPUT * nInputs
pInputs = LPINPUT(*inputs)
cbSize = ctypes.c_int(ctypes.sizeof(INPUT))
return ctypes.windll.user32.SendInput(nInputs, pInputs, cbSize)
INPUT_MOUSE = 0
INPUT_KEYBOARD = 1
def Input(structure):
if isinstance(structure, MOUSEINPUT):
return INPUT(INPUT_MOUSE, _INPUTunion(mi=structure))
elif isinstance(structure, KEYBDINPUT):
return INPUT(INPUT_KEYBOARD, _INPUTunion(ki=structure))
else:
raise TypeError('Cannot create INPUT structure (keyboard)!')
keys = {
'DEFAULT': 0x7E, # F15 key
'SNAPSHOT': 0x2C, # PRINT SCREEN key
'F1': 0x70, # F1 key
'F2': 0x71, # F2 key
'F3': 0x72, # F3 key
'F4': 0x73, # F4 key
'F5': 0x74, # F5 key
'F6': 0x75, # F6 key
'F7': 0x76, # F7 key
'F8': 0x77, # F8 key
'F9': 0x78, # F9 key
'F10': 0x79, # F10 key
'F11': 0x7A, # F11 key
'F12': 0x7B, # F12 key
'F13': 0x7C, # F13 key
'F14': 0x7D, # F14 key
'F15': 0x7E, # F15 key
'F16': 0x7F, # F16 key
'F17': 0x80, # F17 key
'F18': 0x81, # F18 key
'F19': 0x82, # F19 key
'F20': 0x83, # F20 key
'F21': 0x84, # F21 key
'F22': 0x85, # F22 key
'F23': 0x86, # F23 key
'F24': 0x87, # F24 key
}
def Keyboard(code, flags=0):
# Code for key 0..9 or A..Z: it corresponds to the the ASCII code
if len(code) == 1 and re.match(r'[0-9A-Za-z]', code):
key = ord(code.upper())
# Keys 'F...': we use code in the dictionary
else:
key = keys.get(code.upper(), keys['DEFAULT'])
return Input(KEYBDINPUT(key, key, flags, 0, None))
############################################################################
sentences = [
"Don't sleep!",
"Stay awake!",
"Are you still here?",
"Hello...",
"Want some coffee?",
"What are you doing?"
]
def keep_alive(delay, nb_cycles=-1, key='F15'):
"""
Send keystroke F15 at a given delay for a given nb of cycles
Args:
delay(int): delay in seconds
nb_cycles(int): number of cycles (set to -1 for unlimited)
key(str): Key to send (default: 'F15')
"""
print("Trust me, I will keep you alive!\n")
while nb_cycles != 0:
time.sleep(delay)
SendInput(Keyboard(key))
print(random.choice(sentences))
nb_cycles -= 1
if __name__ == ' __main__':
# Information on the Program
copyright_year = 2018
prog = "stay_awake"
version_str = "%s v1.0" % prog
help_string = """\
Purpose: Send a keystroke (F15) to simulate user activity
"""
# Options
parser = ArgumentParser(
description=help_string, prog=prog,
formatter_class=lambda prog:
HelpFormatter(prog, max_help_position=60)
)
parser.add_argument(
"-k", "--key",
type=str, default='F15',
help="Key to send [Dflt: F15]"
)
parser.add_argument(
"-d", "--delay",
type=int, default=234,
help="Delay (in s) between keystrokes [Dflt: 234]"
)
parser.add_argument(
"-r", "--duration",
type=int, default=-1,
help="Duration (in s) or negative value for infinite"
)
options = parser.parse_args()
# Run
nb_cycles = options.duration if options.duration < 0 \
else int(options.duration/options.delay)
keep_alive(options.delay, nb_cycles, key=options.key)