2009-05-12 2 views
17

Y a-t-il un moyen, en Python, de programmer en changeant les états CAPS LOCK/VERR/VERROUILLAGE?Modifier les verrous de clavier en Python

Ce n'est pas vraiment une question de blague - plus comme une vraie question pour un programme de blague. J'ai l'intention de l'utiliser pour faire les lumières faire des choses drôles ...

+1

Quel système d'exploitation que vous exécutez sur? –

Répondre

14

Si vous utilisez Windows, vous pouvez utiliser SendKeys pour cela, je crois.

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

import SendKeys 

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

Il a un code interne conçu pour basculer Numlock, si rien d'autre. – Brian

+0

Merci. Je ne savais pas que Python avait SendKeys. –

+0

Existe-t-il une version python 2.7? Impossible de trouver sur le site SendKeys. –

15

Sur Linux est ici un programme Python à clignoter tous les voyants du clavier et hors:

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

Je suis sous Linux en ce moment, donc je vais essayer. Je visais Windows cependant - cela aurait dû être clair :) –

+3

Bien, mais il faut des privilèges root pour ouvrir/dev/console (sauf si les permissions sont définies). Un moyen pour qu'il fonctionne comme un utilisateur normal? –

2

Pour définir Verr à une valeur spécifique à l'aide SendKeys il est important d'abord détecter l'état de CAPS LOCK. Voici comment faire en python (sous Windows):

import win32api,win32con 

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

Comment obtenez-vous les états ScrollLock et NumLock? –

+0

Je l'ai compris, et je l'ai ajouté à ma réponse ici. –

0

Pour 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 

Sources:

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

Aussi, faites attention à la réponse d'Uri sur la façon de lire l'état de CapsLock. Pour définir un état de LED spécifiquement à vrai ou faux, vous ne pouvez pas simplement basculer aveuglément, vous devez savoir quel est l'état actuel en premier. Il vous montre comment lire l'état de CapsLock. Voici comment lire les 3 états 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

probablement d'aucune utilité pour l'OP mais le partage vaut que quelqu'un pourrait être à la recherche de la réponse que j'étais, mais n'a pas pu trouver la solution sans utiliser les modules tiers. C'est ce que je l'ai fait tourner le verrouillage des majuscules sur

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()) 
Questions connexes