自研RPA:C#编写Windows屏幕自动解锁

自研RPA:C#编写Windows屏幕自动解锁

​ 经过一个多星期的调研,寻找通过程序完成windows屏幕自动的解锁,发现当下方法主要有两种,来也RPA实现屏幕自动解锁使用的是远程登录协议(RDP),未能用此方法解决此问题,换用另一种方法自动登录。通过尝试模拟键盘输入登录,使用C#编写发现在屏锁界面无法使用,最后查到python的WinIO库,可以实现驱动层面的模拟键盘,该方法的缺陷是必须要有ps/2键盘(笔记本自带键盘是的,外接大部分是USB键盘)。
在这里插入图片描述

1、Python 安装 Pywinio库。
2、安装64位系统上的驱动签名:

​ 以管理员身份打开命令窗口CMD。

​ 键入以下命令以启动测试签名。

​ bcdedit.exe /set TESTSIGNING ON

​ 重启计算机。

python模拟键盘键入代码
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 )

VK_CODE = {
    '1': 0x02,
    '2': 0x03,
    '3': 0x04,
    '4': 0x05,
    '5': 0x06,
    '6': 0x07,
    '7': 0x08,
    '8': 0x09,
    '9': 0x0A,
    '0': 0x0B,
    'a': 0x1E,
    'b': 0x30,
    'c': 0x2E,
    'd': 0x20,
    'e': 0x12,
    'f': 0x21,
    'g': 0x22,
    'h': 0x23,
    'i': 0x17,
    'j': 0x24,
    'k': 0x25,
    'l': 0x26,
    'm': 0x32,
    'n': 0x31,
    'o': 0x18,
    'p': 0x19,
    'q': 0x10,
    'r': 0x13,
    's': 0x1F,
    't': 0x14,
    'u': 0x16,
    'v': 0x2F,
    'w': 0x11,
    'x': 0x2D,
    'y': 0x15,
    'z': 0x2C,
    'backspace': 0x0E,
    'clear': 0x0C,
    'enter': 0x0D,
    'shift': 0x10,
    'ctrl': 0x11,
    'alt': 0x12,
    'caps_lock': 0x3A,
    '-': 0x0C,

    '=': 0x0D,
    '[': 0x1A,
    ']': 0x1B,
    '\\': 0x2B,
    ';': 0x27,
    "'": 0x28,
    '`': 0x29,
    ',':0x33,
    '.': 0x34,
    '/': 0x35,
}

def key_input(str):
    for c in str:
        try:
            key_press(VK_CODE[c])
        except:
            key_press(0x3A)
            time.sleep(0.5)
            key_press(VK_CODE[c.lower()])
            key_press(0x3A)


key_press(0x1C)
time.sleep(2)
key_input(pwd)
time.sleep(2)
key_press(0x1C)
key_press(0x1C)

模拟按键网址
https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html

3、使用C#将密码传给python,并调用python脚本实现屏保解锁功能
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值