您现在的位置是:首页 > 技术教程 正文

【教程&整活】python第三方库pynput全局键盘监听+demo“ikun键盘”

admin 阅读: 2024-03-31
后台-插件-广告管理-内容页头部广告(手机)

本篇文章主要讲pynput的键盘监听,以及一个demo“ikun键盘程序”

1. 全局键盘监听

1.1 pynput.keyboard.Listener

这是pynput的子模块keyboard中的一个类,keyboard子模块都是关于键盘操作和监听的

Listener类有两个重要的构造参数,也是我们使用最多的:

Listener(on_press=按下按键时触发的函数,on_release=松开按键时触发的函数)

一般在程序中我们这么使用:

  1. with keyboard.Listener(on_press=按下按键触发的函数,on_release=松开按键触发的函数) as listener:
  2. listener.join()

按下或者松开按键所触发的函数还有一个参数用来接收按键信息,我一般用key作为参数名

listener.join()是线程阻塞函数,它会让这块代码所在的函数始终监听键盘,所以如果有其他需要阻塞线程或者使用主循环的函数(比如rkinter的mainloop()函数)应该使用多线程

举个例子:

  1. from pynput import keyboard#首先导入模块
  2. def key_press(key):#定义按键按下时触发的函数
  3. print("按键被按下了")
  4. def key_release(key):
  5. print("按键被松开了")
  6. with keyboard.Listener(on_press=key_press,on_release=key_release) as listener:
  7. listener.join()

1.2 获取被按下或者被松开的按键

此时被的触发函数接收的参数key派上了用途。如果是普通按键(就是字母或数字之类),key会有一个叫做char的属性,char本身是一个python字符串,我们可以判断字符串从而得知按下或者松开了哪个键。

举个例子:

  1. from pynput import keyboard#首先导入模块
  2. def key_press(key):#定义按键按下时触发的函数
  3. print(f"按键{key.char}被按下了")
  4. def key_release(key):
  5. print(f"按键{key.char}被松开了")
  6. with keyboard.Listener(on_press=key_press,on_release=key_release) as listener:
  7. listener.join()

但是还有特殊按键的存在呢!比如说ctrl、alt、shift等,如果按下或松开这种特殊按键,传入的key可就不一样了,它没有char属性,所以会报错AttributeError: 'Key' object has no attribute 'char'

于是我们可以用try…except语句,如果程序没遇到AttributeErro,就按普通按键处理,如果遇到了,就是特殊按键,而特殊按键可以在keyboard模块的Key中找到它们的“尊姓大名”,比如keyboard.Key.esc

下面请看例子:

  1. from pynput import keyboard#首先导入模块
  2. def key_press(key):#定义按键按下时触发的函数
  3. try:
  4. print(f"按键{key.char}被按下了")
  5. except AttributeError:
  6. pass
  7. def key_release(key):
  8. try:
  9. print(f"按键{key.char}被松开了")
  10. except AttributeError:
  11. pass
  12. with keyboard.Listener(on_press=key_press,on_release=key_release) as listener:
  13. listener.join()

这样按下特殊按键不会报错了

1.3 组合键监听--特殊转义字符

pynput可以监听很多组合键,并且给触发的函数传入转义字符,例如<48>是表示ctrl+0

注意,使用组合键监听需要keyboard模块的另外一员大将-- Controller。下面看例子:

  1. from pynput.keyboard import Key, Controller,Listener
  2. keyboard = Controller()
  3. def on_press(key):
  4. print('{0} 被按下'.format(key))
  5. def on_release(key):
  6. print('{0} 被释放'.format(key))
  7. if key == Key.esc:
  8. return False
  9. if str(key) == r"<48>":# ctrl 0
  10. print('按下ctrl 0,运行测试程序')
  11. # 创建监听
  12. with Listener(on_press=on_press,on_release=on_release) as listener:
  13. listener.join()

组合键键值表如下(摘自Python中的pynput中组合键的键值_一个小坑货的博客-CSDN博客_pynput 组合键):

  1. keyboard_key_dict = {
  2. r"'\x01'" : ['ctrl','a'],
  3. r"'\x02'" : ['ctrl','b'],
  4. r"'\x03'" : ['ctrl','c'],
  5. r"'\x04'" : ['ctrl','d'],
  6. r"'\x05'" : ['ctrl','e'],
  7. r"'\x06'" : ['ctrl','f'],
  8. r"'\x07'" : ['ctrl','g'],
  9. r"'\x08'" : ['ctrl','h'],
  10. r"'\t'" : ['ctrl','i'],
  11. r"'\n'" : ['ctrl','j'],
  12. r"'\x0b'" : ['ctrl','k'],
  13. r"'\x0c'" : ['ctrl','l'],
  14. r"'\r'" : ['ctrl','m'],
  15. r"'\x0e'" : ['ctrl','n'],
  16. r"'\x0f'" : ['ctrl','o'],
  17. r"'\x10'" : ['ctrl','p'],
  18. r"'\x11'" : ['ctrl','q'],
  19. r"'\x12'" : ['ctrl','r'],
  20. r"'\x13'" : ['ctrl','s'],
  21. r"'\x14'" : ['ctrl','t'],
  22. r"'\x15'" : ['ctrl','u'],
  23. r"'\x16'" : ['ctrl','v'],
  24. r"'\x17'" : ['ctrl','w'],
  25. r"'\x18'" : ['ctrl','x'],
  26. r"'\x19'" : ['ctrl','y'],
  27. r"'\x1a'" : ['ctrl','z'],
  28. r"'\x1f'" : ['ctrl','shift','-'],
  29. r"<186>" : ['ctrl',';'],
  30. r"<187>" : ['ctrl','='],
  31. r"<189>" : ['ctrl','-'],
  32. r"<192>" : ['ctrl','`'],
  33. r"<222>" : ['ctrl',r"'"],
  34. r"<48>" : ['ctrl','0'],
  35. r"<49>" : ['ctrl','1'],
  36. r"<50>" : ['ctrl','2'],
  37. r"<51>" : ['ctrl','3'],
  38. r"<52>" : ['ctrl','4'],
  39. r"<53>" : ['ctrl','5'],
  40. r"<54>" : ['ctrl','6'],
  41. r"<55>" : ['ctrl','7'],
  42. r"<56>" : ['ctrl','8'],
  43. r"<57>" : ['ctrl','9'],
  44. r"'~'" : ['shift', '`'],
  45. r"'!'" : ['shift', '1'],
  46. r"'@'" : ['shift', '2'],
  47. r"'#'" : ['shift', '3'],
  48. r"'$'" : ['shift', '4'],
  49. r"'%'" : ['shift', '5'],
  50. r"'^'" : ['shift', '6'],
  51. r"'*'" : ['shift', '7'],
  52. r"'('" : ['shift', '8'],
  53. r"')'" : ['shift', '9'],
  54. r"'_'" : ['shift', '-'],
  55. r"'+'" : ['shift', '='],
  56. r"':'" : ['shift', ';'],
  57. r"'\"'" : ['shift', "'"],
  58. r"'<'" : ['shift', ","],
  59. r"'{'" : ['shift', "["],
  60. r"'}'" : ['shift', "]"],
  61. r"'|'" : ['shift', "\\"],
  62. r"'?'" : ['shift', "/"],
  63. }

1.4 keyboard.GlobalHotkey热键

这个类需要以一个字典为参数,字典结构是{"热键":触发函数},热键名是字符串,如果拼写不正确是会报错的

举例:

  1. from pynput import keyboard
  2. def one():
  3. print("按下了ctrl+t")
  4. def two():
  5. print("按下了ctrl+shift")
  6. with keyboard.GlobalHotKeys({"+t":one,"+":two}) as listener:
  7. listener.join()

2. ikun专属键盘(滑稽

(提示:适当玩梗,笑梗不笑人,demo仅供学习需要)

音频播放我们使用playsound模块,可以直接pip安装,音频文件请自备

  1. from pynput import keyboard#首先导入模块
  2. import playsound
  3. def press(key):
  4. try:
  5. print(key.char)#调试输出
  6. if key.char=="j":
  7. playsound.playsound("J.mp3")
  8. elif key.char=="n":
  9. playsound.playsound("n.mp3")
  10. elif key.char=="t":
  11. playsound.playsound("t.mp3")
  12. elif key.char=="m":
  13. playsound.playsound("m.mp3")
  14. except AttributeError:
  15. if key==keyboard.Key.ctrl or key==keyboard.Key.ctrl_l or key==keyboard.Key.ctrl_r:
  16. print("只因你太美")
  17. playsound.playsound("jntm.mp3")
  18. with keyboard.Listener(on_press=press) as listener:
  19. listener.join()

这样就有了一个可以挂在后台的ikun键盘程序,可以根据个人喜好完善,还可以放进开机自启动文件夹中(滑稽

 

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索