2009-05-12 11 views
17

¿Hay alguna manera, en Python, de programar cambiar los estados CAPS LOCK/NUM LOCK/SCROLL LOCK?Cambiar bloqueos de teclado en Python

Esto no es realmente una pregunta broma - más como una pregunta real para un programa de broma. Tengo la intención de usarlo para hacer las luces de hacer cosas divertidas ...

+1

¿En qué SO lo está ejecutando? –

Respuesta

14

Si está utilizando ventanas se puede utilizar para este SendKeys creo.

http://www.rutherfurd.net/python/sendkeys

import SendKeys 

SendKeys.SendKeys(""" 
{CAPSLOCK} 
{SCROLLOCK} 
{NUMLOCK} 
""") 
+0

Se tiene código interno diseñado para alternar Numlock, si nada más. – Brian

+0

Gracias. No sabía que Python tenía SendKeys. –

+0

¿Hay una versión de Python 2.7? Parece que no puede encontrarlo en el sitio SendKeys. –

15

En Linux He aquí un programa de Python a parpadear todos los LED del teclado de encendido y apagado:

import fcntl 
import os 
import time 

KDSETLED = 0x4B32 
SCR_LED = 0x01 
NUM_LED = 0x02 
CAP_LED = 0x04 

console_fd = os.open('/dev/console', os.O_NOCTTY) 

all_on = SCR_LED | NUM_LED | CAP_LED 
all_off = 0 

while 1: 
    fcntl.ioctl(console_fd, KDSETLED, all_on) 
    time.sleep(1) 
    fcntl.ioctl(console_fd, KDSETLED, all_off) 
    time.sleep(1) 
+0

Ahora mismo estoy en Linux, así que daré una oportunidad. Estaba apuntando a Windows, debería haberlo dejado claro :) –

+3

Bueno, pero necesita privilegios de root para abrir/dev/console (a menos que se hayan establecido permisos). ¿Hay alguna forma de que se ejecute como un usuario normal? –

2

Para establecer CAPS LOCK a un valor específico usando SendKeys es importante primero detectar el estado de CAPS LOCK. He aquí cómo hacerlo en Python (en Windows):

import win32api,win32con 

def IsCapsLockOn(): 
    # return 1 if CAPSLOCK is ON 
    return win32api.GetKeyState(win32con.VK_CAPITAL) 
+0

¿Cómo se obtienen los estados ScrollLock y NumLock? –

+0

lo he descubierto, y simplemente añadido a mi respuesta aquí. –

0

Para Windows:

#https://stackoverflow.com/questions/21549847/send-key-combination-with-python 
#https://msdn.microsoft.com/en-us/library/8c6yea83(v=vs.84).aspx 

import win32com.client as comclt 
wsh= comclt.Dispatch("WScript.Shell") 
wsh.SendKeys("abc") #types out abc directly into wherever you have your cursor (ex: right into this editor itself!) 

wsh.SendKeys("{NUMLOCK}{CAPSLOCK}{SCROLLLOCK}") #toggles the state of NumLock, CapsLock, and ScrollLock; remove whichever one you don't want to toggle 

Fuentes:

  1. Send key combination with python
  2. https://msdn.microsoft.com/en-us/library/8c6yea83(v=vs.84).aspx

Además, preste especial atención a la respuesta de Uri sobre cómo leer el estado CapsLock. Para establecer un estado LED específicamente a verdadero o falso, no se puede cambiar a ciegas, usted tiene que saber lo que el estado actual es el primero. Él le muestra cómo leer el estado CapsLock. Así es como leer los 3 estados de los LED:

#https://stackoverflow.com/questions/854393/change-keyboard-locks-in-python/854442#854442abc 
#https://support.microsoft.com/en-us/kb/177674 
import win32api,win32con 

def isCapsLockOn(): 
    "return 1 if CapsLock is ON" 
    return win32api.GetKeyState(win32con.VK_CAPITAL) 

def isNumLockOn(): 
    "return 1 if NumLock is ON" 
    return win32api.GetKeyState(win32con.VK_NUMLOCK) 

def isScrollLockOn(): 
    "return 1 if ScrollLock is ON" 
    return win32api.GetKeyState(win32con.VK_SCROLL) 

print("IsCapsLockOn = ", IsCapsLockOn()) 
print("isNumLockOn = ", isNumLockOn()) 
print("isScrollLockOn = ", isScrollLockOn()) 
0

Probablemente de ninguna utilidad para el PO, pero vale la pena compartir como alguien podría estar buscando la respuesta, ya que estaba pero no pudo encontrar la solución sin necesidad de utilizar módulos de terceros. Esto es lo que hice para activar el bloqueo de mayúsculas en

import ctypes 

def turn_capslock(): 
    dll = ctypes.WinDLL('User32.dll') 
    VK_CAPITAL = 0X14 
    if not dll.GetKeyState(VK_CAPITAL): 
     dll.keybd_event(VK_CAPITAL, 0X3a, 0X1, 0) 
     dll.keybd_event(VK_CAPITAL, 0X3a, 0X3, 0) 

    return dll.GetKeyState(VK_CAPITAL) 
print(turn_capslock()) 
Cuestiones relacionadas