背景

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

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

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. SQLMap入门——获取当前网站数据库的名称

    列出当前网站使用的数据库 python sqlmap.py -u http://localhost/sqli-labs-master/Less-1/?id=1 --current-db

  2. 学习ASP.NET Core Blazor编程系列十七——文件上传(上)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  3. nuxt.js中引入lib-flexible 和 postcss-px2rem 实现pc自适应

    最近一个需要用nuxt框架实现的pc自适应项目,从网上找了很多资料,最终完美实现 一.下载相关插件 npm i lib-flexible -Snpm i px2rem-loader -Dnpm ins ...

  4. 基于SqlSugar的开发框架循序渐进介绍(23)-- Winform端管理系统中平滑增加对Web API对接的需求

    在前面随笔介绍的基于SqlSugar的WInform端管理系统中,数据提供者是直接访问数据库的方式,不过窗体界面调用数据接口获取数据的时候,我们传递的是标准的接口,因此可扩展性比较好.我曾经在随笔&l ...

  5. 基于 Traefik 如何实现 path 末尾自动加斜杠?

    前言 Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易. Traefik 可以与现有的多种基础设施组件(Docker.Swarm 模式.Kubernetes.Mara ...

  6. 使用nodejs编写api接口并部署到服务器上

    一.用node.js编写api接口 1.安装node环境,没有就去下载nodejs, 下载地址 2.创建一个node项目, 新建一个目录文件,例node_proxy 3.在新建的node项目执行npm ...

  7. 结合商业项目深入理解Go知识点

    这篇文章比较硬核,爆肝5千字,把之前整理的知识点都串起来了.建议先收藏,慢慢看. 前言 上一篇文章 #[Go WEB进阶实战]开源的电商前后台API系统 很受大家欢迎,有好多小伙伴私信我问题:&quo ...

  8. Spark详解(07-1) - SparkStreaming案例实操

    Spark详解(07-1) - SparkStreaming案例实操 环境准备 pom文件 <dependencies>     <dependency>         &l ...

  9. 可持久化栈学习笔记 | 题解 P6182 [USACO10OPEN]Time Travel S

    简要题意 你需要维护一个栈,有 \(n\) 个操作,支持: 给定一个 \(x\),将 \(x\) 加入栈. 将一个元素出栈. 给定一个 \(x\),将当前栈回退到 第 \(x\) 操作前. 每一次操作 ...

  10. Linux基础操作-02

    Linux操作 Linux操作权限 显示详细信息之后,文件地权限显示 drwxrwxrwx "-" 表示常规文件 d 目录文件 b 块特殊设备 c 字符特殊设备文件 p 管道设备文 ...