【问题标题】:Python pywin32 - VK_SLEEP press not workingPython pywin32 - VK_SLEEP 按下不工作
【发布时间】:2019-04-14 14:24:27
【问题描述】:

我找到了按下虚拟键的解决方案: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)。

【问题讨论】:

    标签: python keyboard pywin32


    【解决方案1】:

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

    【讨论】:

    • 编辑:唯一的问题是电脑在我进入睡眠状态后立即唤醒。如果我以经典方式(开始菜单)使 PC 进入睡眠状态,仅使用此脚本就没有问题。
    • 这很奇怪。 SetSuspendState 中的第二个参数应禁用唤醒计时器,如 MS 文档中所述。你的操作系统是什么?
    • Windows 10。我会测试更多。我在网上找到了一些从睡眠中唤醒 PC 的 oslution。
    • 很好的答案,非常感谢。什么是正确的 SetSuspendState tho?
    • @DanielReyhanian 另一个答案没有错。如果您不想禁用唤醒事件,可以将第三个参数设置为 false,例如防病毒软件可以唤醒计算机以运行扫描。或者,如果您想在没有唤醒事件的情况下睡觉,请使用 False, True, False
    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2020-08-15
    • 2016-06-29
    • 2013-08-08
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    相关资源
    最近更新 更多