首页 > 解决方案 > Python pywin32 - VK_SLEEP 按下不工作

问题描述

我找到了按虚拟键的解决方案: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 让 PC 进入睡眠状态。这是我使用的 VK_ 代码的来源:https ://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes

需要明确的是:我的键盘没有专用的睡眠按钮。但是,也没有“音量增大”,并且 0xAF (vlume_up) 有效。所以,我认为问题不在于键盘(它是 CM MK750)。

标签: pythonkeyboardpywin32

解决方案


模拟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)

推荐阅读