背景

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

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

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() # 等待子进程结束再往下执行

京城郭少

Mac监控键盘输入并执行动作的更多相关文章

  1. android键盘输入读取

    android键盘输入读取  监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法.另一种是在jni层实现,监控/dev/input/event0键盘 ...

  2. java学习笔记(5) 控制语句、键盘输入

    控制语句: java控制可以分为7种: *控制选择结构语句: *if  if else *switch *控制循环结构语句: *for *while *do while *改变控制语句顺序: *bre ...

  3. HTML界面监控键盘回车Enter按下并绑定动作

    本示例绑定键盘回车键(Enter),触发发送WebSocket消息动作 <script type="text/javascript"> //监控键盘Enter 回车键按 ...

  4. VB模拟键盘输入的N种方法

    VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...

  5. 【转】python win32api win32gui win32con 简单操作教程(窗口句柄 发送消息 常用方法 键盘输入)

    作者:https://blog.csdn.net/qq_16234613/article/details/79155632 附:https://www.programcreek.com/python/ ...

  6. WPF进阶技巧和实战09-事件(1-路由事件、鼠标键盘输入)

    理解路由事件 当有意义的事情发生时,有对象(WPF的元素)发送的用于通知代码的消息,就是事件的核心思想.WPF通过事件路由的概念增强了.NET事件模型.事件由允许源自某个元素的事件由另一个元素引发.例 ...

  7. 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示

    1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...

  8. javascript键盘输入控制

    获取键盘控制事件 document.onkeydown = keyDown 当浏览器读到这个语句时,无论按下键盘上的哪个键,都将呼叫KeyDown()函数. 不同浏览器的实现: Netscape Ne ...

  9. Windows 窗体—— 键盘输入工作原理

    方法 注释 PreFilterMessage 此方法在应用程序级截获排队的(也称为已发送的)Windows 消息. PreProcessMessage 此方法在 Windows 消息处理前在窗体和控件 ...

  10. while ((ch = getchar()) != EOF)中ch定义为char还是int型?cin、scanf等如何结束键盘输入

    2013-07-09 18:55:42 EOF是文件的结束符,具体可以作为文本文件的结束符,也可以作为键盘输入char类型数据时的结束符.对于不同的系统,EOF的定义可能不同,一般定义为-1.因为ch ...

随机推荐

  1. Java开发学习(四十五)----MyBatisPlus查询语句之映射匹配兼容性

    1.映射匹配兼容性 我们已经能从表中查询出数据,并将数据封装到模型类中,这整个过程涉及到一张表和一个模型类: 之所以数据能够成功的从表中获取并封装到模型对象中,原因是表的字段列名和模型类的属性名一样. ...

  2. python函数及算法

    算法二分法 二分算法图 什么是算法? ​ 算法是高效解决问题的办法. 需求:有一个按照从小到大顺序排列的数字列表,查找某一个数字 # 定义一个无序的列表 nums = [3,4,5,67,8,9,12 ...

  3. STL set容器常用API

    set容器,容器内部将数据自动排序(平衡二叉树),不能插入重复元素.multiset可以插入重复元素.不能修改容器中的值,通过删除值,在插入. #define _CRT_SECURE_NO_WARNI ...

  4. asp+vb.net解决调接口返回中文乱码问题

    1.问题描述 涉及语言:vb,vbscript,vb.net,asp 最近在工作中碰到了这样一个问题:需要调用一个接口解析简历文件中的关键信息.直接用postman测试该接口,接口返回值没问题,但一旦 ...

  5. c#5.0(.net 4.5之后)的 Async+await+Task的异步机制的调试笔记

    1.)无返回值的情况(异步也是基于线程). using System; using System.Collections.Generic; using System.Linq; using Syste ...

  6. 基于docker容器的MySQL主从设置及efcore读写分离

    1.基于docker部署MySQL,设置主从 本操作基于已经拉取的镜像(docker pull mysql) 创建一主一从两个数据库容器 docker run -d -p 3307:3306 -e M ...

  7. 买不到的数目【第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组】

    买不到的数目 小明开了一家糖果店. 他别出心裁:把水果糖包成4颗一包和7颗一包的两种. 糖果不能拆包卖. 小朋友来买糖的时候,他就用这两种包装来组合. 当然有些糖果数目是无法组合出来的,比如要买 10 ...

  8. [cocos2d-x]捕鱼达人鱼和子弹的碰撞检测

    检测方法如图所示,步骤在注释中也写的很清楚了.

  9. 【转】C#接口知识

    参考:日常收集 C# 接口知识 (知识全面) 目录 第一节 接口慨述 第二节 定义接口 第三节 定义接口成员 第四节.访问接口 第五节.实现接口 第六节.接口转换 第七节.覆盖虚接口 第一节 接口慨述 ...

  10. 超详细手把手教你cordova开发使用指南+自定义插件,jsbridge

    Cordova是什么 使用前端技术 开发跨平台web App的工具 底层原理:HTML+CSS搭建页面, JS和原生交互 交互原理:Cordova插件 环境配置 安卓开发基础环境搭建的文章可以参考一下 ...