Python pywin32 - не работает пресс VK_SLEEP - PullRequest
0 голосов
/ 11 ноября 2018

Я нашел это решение для нажатия виртуальных клавиш: https://stackoverflow.com/a/10441322/3448364 Но проблема в том, что VK_SLEEP не работает для меня. Я попытался со всеми другими ключами VK_ (например, VK_VOLUME_UP, VK_MEDIA_NEXT_TRACK ...), и это работает, только VK_SLEEP не работает. Это мой код:

VK_SLEEP = 0x5F
hwcode = win32api.MapVirtualKey(VK_SLEEP, 0)
win32api.keybd_event(VK_SLEEP, hwcode)

Когда я выполняю этот код, ничего не происходит. Когда я меняю виртуальный ключ на ie. VK_VOLUME_UP: работает как шарм! Итак, с кодом все в порядке, но по какой-то причине скрипт не будет переводить ПК в спящий режим с помощью VK_SLEEP. Это источник кодов VK_, которые я использую: https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes

Просто чтобы прояснить: на моей клавиатуре нет специальной кнопки «Режим сна». Но также не имеет «увеличения громкости», и 0xAF (vlume_up) работает. Итак, я не думаю, что проблема в клавиатуре (это CM MK750).

1 Ответ

0 голосов
/ 12 ноября 2018

Имитация VK_SLEEP не будет иметь никакого эффекта, вероятно, по соображениям безопасности.

Изменение состояния питания системы требует SE_SHUTDOWN_NAME привилегий. Если привилегии успешно изменены, вы можете использовать SetSuspendState, чтобы перевести компьютер в спящий режим.

import win32api
import win32security
import ctypes

def sleep_mode():
    access = (win32security.TOKEN_ADJUST_PRIVILEGES | win32security.TOKEN_QUERY)
    htoken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), access)
    if htoken:
        priv_id = win32security.LookupPrivilegeValue(None, win32security.SE_SHUTDOWN_NAME)
        win32security.AdjustTokenPrivileges(htoken, 0,
            [(priv_id, win32security.SE_PRIVILEGE_ENABLED)])
        ctypes.windll.powrprof.SetSuspendState(False, True, True)
        win32api.CloseHandle(htoken)

sleep_mode()

примечание,

keybd_event толкает ключ вниз. Удостоверьтесь, что ключ сдвинут назад. Пример:

import win32api
import win32con

win32api.keybd_event(win32con.VK_VOLUME_UP, 0)
win32api.keybd_event(win32con.VK_VOLUME_UP, 0, win32con.KEYEVENTF_KEYUP)
...