背景

电脑的安全是非常重要的,特别是里面的敏感数据,若是被有心之人利用,那后果不堪设想。

所以我们部门定下了一个规矩,谁离开工位要是不锁屏,就可以在部门群发送一个消息:我请大家吃鸡翅。

oh,技术出身怎么可以让这种事情发生。

简介

最新代码我放到了这里:https://github.com/GuoFlight/ListenKey ,欢迎Star与交流。

代码逻辑是,监听到指定的字符串就会「执行动作」。

代码实现

执行环境:Mac+Python3.(Windows也可,但要修改小部分代码)

仓库中我还实现了启停脚本control.sh。这里只介绍主要逻辑。

将以下代码后台执行,当键盘输入"jichi", "qingdajia", "dajia", "weizheng"这些字符串时,Mac就会锁屏。

#!/usr/bin/python3
from pynput.keyboard import Listener
import os
import time
import signal
from multiprocessing import Pool #####################################
# 程序作用:监听键盘,若输入了指定的字符串,则执行相应的动作
# 作者:京城郭少
##################################### class ListenKey:
def __init__(self, listenStr="", actionFunc=None):
self.listenStr = listenStr
self.actionFunc = actionFunc
self.index = 0 def on_press(self, key):
# print("监听到了",key) # DEBUG
if self.listenStr == "" or self.actionFunc == None:
return
pressKey = None
try:
pressKey = key.char
except AttributeError:
pressKey = key
if pressKey == self.listenStr[self.index]:
# print("本次按键符合条件") # DEBUG
if self.index == len(self.listenStr) - 1:
self.index = 0
self.actionFunc()
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print("【%s】执行动作" % (now),flush=True) # DEBUG
else:
self.index = (self.index + 1) % (len(self.listenStr))
else:
self.index = 0 def on_release(self, key):
return def start_listen(self):
# print("开始监听") #DEBUG
with Listener(on_press=self.on_press, on_release=self.on_release) as listener:
listener.join() #指定动作
def actionFunc():
#os.system("shutdown -s now")
os.system("osascript -e 'tell application \"System Events\" to key code 12 using {control down,command down}'")
#print("hello",flush=True) #处理信号
def handle_exit(sig, stack_frame):
print('eixt',flush=True)
p.terminate()
exit(0) if __name__ == '__main__':
keywords = ["jichi", "qingdajia", "dajia", "weizheng"] signal.signal(signal.SIGINT, handle_exit)
signal.signal(signal.SIGQUIT, handle_exit)
signal.signal(signal.SIGTERM, handle_exit)
# signal.signal(signal.SIGKILL, handle_exit)
listenKey = []
p = Pool(6) # 最多同时执行6个进程
for i in keywords:
listenKey.append(ListenKey(i, actionFunc))
for i in listenKey:
p.apply_async(i.start_listen) # 在进程池中添加进程
p.close()
p.join() # 等待子进程结束再往下执行

京城郭少

最新文章

  1. QT学习(打个广告)
  2. yourtour的几种链接
  3. 2014年度辛星css教程夏季版第二节
  4. 浅谈PetShop之使用存储过程与PLSQL批量处理(附案例)
  5. oracle-绑定变量学习笔记(未完待续)
  6. JPA事务回滚配置
  7. 注意在insert插入数据库时的int类型问题
  8. twisted的一些代码
  9. SQL 游标的使用
  10. C# WPF仿360安全卫士11
  11. python基础之 列表,元组,字典
  12. FMX取得屏分辨率
  13. 学习笔记之Introduction to Data Visualization with Python | DataCamp
  14. Innodb中自增长值的列
  15. gitignore中常见需要被无视的文件
  16. java非常好用的读取文件的流的代码
  17. Linux 修改 IP地址 和 网关
  18. [BZOJ2758] [SCOI2012]Blinker的噩梦 扫描线+set
  19. wget 命令大全
  20. tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控

热门文章

  1. k8s驱逐篇(5)-kube-controller-manager驱逐
  2. TIE: A Framework for Embedding-based Incremental Temporal Knowledge Graph Completion 增量时序知识图谱补全论文解读
  3. uniapp(vue)实现点击左侧菜单,右侧显示对应的内容
  4. [0x11] 131.直方图中最大的矩形【单调栈】
  5. 【CTF隐写工具】binwalk工具使用方法
  6. 一步步教你在Edge浏览器上安装网风笔记
  7. Html飞机大战(十八): 模块化+项目开源
  8. [Unity]限制两个物体之间的距离
  9. JavaScript 内存管理及垃圾回收
  10. 移动端微信小程序开发学习报错记录--toast.js:41 未找到 van-toast 节点,请确认 selector 及 context 是否正确