解锁屏的小尝试

设计器 8.0 自带的解锁屏测试过在 win7 上确实能够成功。但是存在需要按 del+alt+del 三个键解锁屏的时候,貌似就不行了,反正我的测试环境(Windows 2008 R2)是这种情况就会不行了。
经过了解,自带的解锁屏使用的的服务是 WINIO 服务。
那好,上网找了些关于 python 和 WINIO 的资料,发现可以喔,有个库叫做 pywinio 的能够实现驱动层面模拟键盘输入。https://pypi.org/project/pywinio/
好了,要准备搞搞它了:
1、检查你的 WINIO 服务是否正常运行,cmd 下敲 sc query winio,如果是 running,那就行了,如果是 stop,估计就要重装设计器了
2、打开设备管理器,确保硬盘下有个叫 PS 标准键盘什么的东西
3、在设计器的环境中安装 pywinio 的库,有外网的话可以用 pip 来安装,python -m pip install pywinio
好了,自己写 py 文件,内容类似以下:至于键位对应的码参考链接:https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html

import pywinio
import time
import atexit

# KeyBoard Commands
# Command port
KBC_KEY_CMD = 0x64
# Data port
KBC_KEY_DATA = 0x60

g_winio = None

def get_winio():
    global g_winio

    if g_winio is None:
            g_winio = pywinio.WinIO()
            def __clear_winio():
                    global g_winio
                    g_winio = None
            atexit.register(__clear_winio)

    return g_winio

def wait_for_buffer_empty():
    '''
    Wait keyboard buffer empty
    '''

    winio = get_winio()

    dwRegVal = 0x02
    while (dwRegVal & 0x02):
            dwRegVal = winio.get_port_byte(KBC_KEY_CMD)

def key_down(scancode):
    winio = get_winio()

    wait_for_buffer_empty();
    winio.set_port_byte(KBC_KEY_CMD, 0xd2);
    wait_for_buffer_empty();
    winio.set_port_byte(KBC_KEY_DATA, scancode)

def key_up(scancode):
    winio = get_winio()

    wait_for_buffer_empty();
    winio.set_port_byte( KBC_KEY_CMD, 0xd2);
    wait_for_buffer_empty();
    winio.set_port_byte( KBC_KEY_DATA, scancode | 0x80);

def key_press(scancode, press_time = 0.2):
    key_down( scancode )
    time.sleep( press_time )
    key_up( scancode )


# Press 'A' key
# Scancodes references : https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
key_press(0x1E)

102fceded8ab49e78a717fa3e7f058aa_Keyboard_Emulation.py

附件是我自己写的关于锁屏后解锁的小玩意,因为只是小尝试,所以就没考虑很全面。