2015-12-01 1 views
0

J'ai la recherche d'un moyen d'identifier l'état de verrouillage des majuscules en Python 3 et la seule chose que j'ai trouvé applicable était a post here in Stack Overflow answered by Abhijit indiquant:python 3 détecter bouchons d'état de verrouillage

Vous pouvez utiliser ctypes pour charger user32.dll puis appeler GetKeyState avec nVirtKey = VK_CAPITAL (0x14)

def get_capslock_state(): 
    import ctypes 
    hllDll = ctypes.WinDLL ("User32.dll") 
    VK_CAPITAL = 0x14 
    return hllDll.GetKeyState(VK_CAPITAL) 

J'ai appliqué à mon script, mais la valeur retournée est pas attendu 1/0, mais une longue 9 séquence de numéros qui ne se répète jamais. Je ne suis pas certain comment utiliser cette valeur pour renvoyer le 1/0, T/F, ou n'importe quelle vraie valeur contre.

Des idées, basées sur le commentaire d'Abhijit ou une autre méthode qui fonctionne en Python 3? Votre aide est grandement appréciée, car cela me rend fou.

+2

Quelle est la longue séquence renvoyée? Quel système d'exploitation utilisez-vous? – senshin

+0

Le script s'exécute sur Windows, bien sûr (d'où le WinDLL). Je cours Windows 7 Enterprise, si cela fait une différence. – danjmwalker

+0

Quant à la valeur renvoyée, elle change toujours la séquence numérique mais elle comporte toujours 9 caractères. Un exemple de la dernière exécution est "361693184". – danjmwalker

Répondre

1

D'après les apparences, votre valeur est traitée comme un nombre entier.

hllDll.GetKeyState obtient sa valeur de retour à partir de la fonction Win32 GetKeyState vue here.

La valeur renvoyée par Windows est une valeur courte. Votre valeur de retour de la fonction était 361693184, ce qui si vous traduisez en binaire est 10101100011110000000000000000. Notez les 16 bits de fin. Je devine que la valeur de retour est venue d'un test quand vous auriez dû obtenir un 0, et parce qu'il essaie de lire un entier de 32 bits, les 16 premiers bits sont juste garbage.

Je commencerais par regarder votre code pour voir pourquoi il pourrait supposer que la valeur est un entier de 32 bits. Les joies de la frappe de canard :)

J'espère que cela aide! Si cela ne semble pas être le problème, postez du code où vous appelez la fonction, afin que nous puissions mieux voir.

0

Merci, Gimson, qui a aidé. J'ai été en mesure de résoudre ce problème en appelant la valeur ci-dessous:

def CAPSLOCK_STATE(): 
    import ctypes 
    hllDll = ctypes.WinDLL ("User32.dll") 
    VK_CAPITAL = 0x14 
    return hllDll.GetKeyState(VK_CAPITAL) 

CAPSLOCK = CAPSLOCK_STATE() 
if ((CAPSLOCK) & 0xffff) != 0: 
    print("\nWARNING: CAPS LOCK IS ENABLED!\n") 

Cela fait l'affaire.

+0

Ne pas charger la DLL dans la fonction. Chaque fois que vous le faites, il appelle WinAPI 'LoadLibrary' et incrémente inutilement le compte de référence du chargeur sur la DLL. Faites-en une variable globale ou de classe nommée 'user32'. – eryksun

+0

Configurez-le en tant que 'user32 = ctypes.WinDLL ('user32');' 'user32.GetKeyState.restype = ctypes.c_short'. Vous n'aurez plus besoin de masquer le résultat. – eryksun