Python Pywin32-VK_SLEEP新闻不起作用

时间:2018-11-11 19:35:51

标签: python keyboard pywin32

我找到了用于按虚拟键的解决方案:https://stackoverflow.com/a/10441322/3448364 但是,问题是VK_SLEEP对我不起作用。我尝试了所有其他VK_键(例如VK_VOLUME_UP,VK_MEDIA_NEXT_TRACK ...),并且它可以正常工作,只有VK_SLEEP无法正常工作。 这是我的代码:

rix

当我执行该代码时,nothig发生。当我将虚拟密钥更改为ie时。 VK_VOLUME_UP:就像一个魅力!因此,代码是可以的,但是由于某些原因,脚本不会使PC处于VK_SLEEP状态。 这是我使用的VK_代码的来源:https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes

请明确说明:我的键盘没有专用的“睡眠”按钮。但是,也没有“调高音量”,因此0xAF(vlume_up)可以工作。因此,我认为问题不在于键盘(它是CM MK750)。

1 个答案:

答案 0 :(得分:3)

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