2015-12-01 3 views
0

Я искал способ, чтобы определить состояние CAPS LOCK в Python 3 и единственное, что я нашел, это применимо было a post here in Stack Overflow answered by Abhijit указанием:питон 3 обнаружения Caps Lock статус

Вы можете использовать ctypes загрузить user32.dll, а затем вызвать GetKeyState с nVirtKey = VK_CAPITAL (0x14)

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

Я применил это мой сценарий, но возвращаемое значение не ожидается 1/0, но долго 9, которая никогда не повторяется. Я не уверен, как использовать это значение для возврата 1/0, T/F или любого истинного значения для проверки.

Любые идеи, основанные на комментарии Абхиджит или на другом методе, который работает в Python 3? Ваша помощь очень ценится, так как это сводит меня с ума.

+2

Какова длительная последовательность, которую он возвращает? Какую ОС вы используете? – senshin

+0

Скрипт работает в Windows, конечно (отсюда WinDLL). Я запускаю Windows 7 Enterprise, если это имеет значение. – danjmwalker

+0

Что касается возвращаемого значения, оно всегда меняет числовую последовательность, но всегда 9 символов. Пример из последнего прогона - «361693184». – danjmwalker

ответ

1

Из-за внешнего вида ваше значение обрабатывается как целое число полного размера.

hllDll.GetKeyState получает свое возвращаемое значение из функции Win32 GetKeyState, которая видна here.

Возвращаемое значение из Windows является коротким. Ваше возвращаемое значение из функции было 361693184, которое, если вы переводите в двоичный файл, равно 10101100011110000000000000000. Обратите внимание на конечные 16 0-бит. Я предполагаю, что возвращаемое значение пришло из теста, когда вы должны получить 0, и потому что он пытается прочитать полный 32-битный int, верхние 16 бит - всего лишь мусор.

Я бы начал с рассмотрения вашего кода, чтобы понять, почему он может предположить, что значение представляет собой 32-разрядное целое число. Радости утиных печатей :)

Надеюсь, это поможет! Если это не проблема, отправьте код, в котором вы вызываете функцию, чтобы мы могли лучше выглядеть.

0

Спасибо, Джимсон, что действительно помогло. Я смог разрешить это, вызвав следующее значение:

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") 

Это трюк.

+0

Не загружайте DLL в функции. Каждый раз, когда вы это делаете, он вызывает WinAPI 'LoadLibrary' и бессмысленно увеличивает счетчик ссылок загрузчика на DLL. Сделайте его глобальной или переменной класса с именем 'user32'. – eryksun

+0

Установите его как 'user32 = ctypes.WinDLL ('user32');' 'user32.GetKeyState.restype = ctypes.c_short'. Теперь вам не нужно замаскировать результат. – eryksun