Python制作Windows按键通知脚本

目录
  • 前言
  • 1.准备
  • 2.源码使用与解析
    • 2.1 源码使用
    • 2.2 源码分析
  • 3.扩展触发通知

前言

对于键盘没有背光灯的同学而言,切换大小写或控制Num键开关的时候没有提示,经常需要试探性地输入一些字符来判断开关是否打开,体验非常糟糕。

因此,有人就想到自制脚本这一招,一旦触发大小写切换或Num键切换就进行windows通知提示:

https://github.com/skate1512/Toggle_Keys_Notification

今天我们来试试这个脚本,此外,我们还可以基于这个项目,扩展成任意一个按键被触发或切换都进行 windows 通知的脚本:

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南进行安装。

(可选1)如果你用Python的目的是数据分析,可以直接安装Anaconda,它内置了Python和pip.

(可选2)此外,推荐大家用VSCode编辑器,它有许多的优点

请选择以下任一种方式输入命令安装依赖

1. Windows 环境 打开 Cmd (开始-运行-CMD)。

2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。

3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install win10toast

除此之外,我们需要下载作者的代码,如果你能联通GitHub,请前往以下地址下载:

https://github.com/skate1512/Toggle_Keys_Notification

2.源码使用与解析

2.1 源码使用

作者的项目可以在 Toggle_Keys_Notification 项目内,运行 notify.py 启动监听:

python notify.py

启动后点击一下大小写切换键,触发通知则说明代码正常运转:

2.2 源码分析

该项目通过win32gui和win32con实现了弹出toast进行通知的功能,最核心的_show_toast代码位于 toast.py 中,下面是这个函数的部分代码剖析:

注册和创建 window :

message_map = {WM_DESTROY: self.on_destroy, }
# 注册Window
self.wc = WNDCLASS()
self.hinst = self.wc.hInstance = GetModuleHandle(None)
self.wc.lpszClassName = str("PythonTaskbar") # 定义该窗口结构的名称
self.wc.lpfnWndProc = message_map
try:
    self.classAtom = RegisterClass(self.wc)
except:
    pass
# Window格式
style = WS_OVERLAPPED | WS_SYSMENU
# 创建Window
self.hwnd = CreateWindow(self.classAtom, "Taskbar", style,
                         0, 0, CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         0, 0, self.hinst, None)
UpdateWindow(self.hwnd)

所使用到的win32模块解析如下。

GetModuleHandle: 获取一个应用程序或动态链接库的模块句柄。

WM_DESTROY: 关闭程序。

RegisterClass:将定义好的Window属性保存保存下来。

WS_OVERLAPPED: 重叠式窗口,该式样窗口 带有一个标题栏和边框。

WS_SYSMENU: 具有 SYSTEM 菜单栏的样式

CW_USEDEFAULT: 采用系统默认位置

CreateWindow这个函数有非常多的参数,甚至有一个百度百科来详细解析每一个参数的具体作用

了解win32这些模块名称的意义后,理解上述代码的逻辑便很轻松了。

图标加载及任务栏图标显示配置:

# 图标
if icon_path is not None:
    # 获取图标地址
    icon_path = path.realpath(icon_path)
else:
    icon_path = resource_filename(Requirement.parse("win10toast"), "win10toast/data/python.ico")
# 加载格式
icon_flags = LR_LOADFROMFILE | LR_DEFAULTSIZE
try:
    hicon = LoadImage(self.hinst, icon_path, IMAGE_ICON, 0, 0, icon_flags)
except Exception as e:
    logging.error("Some trouble with the icon ({}): {}"
                  .format(icon_path, e))
    hicon = LoadIcon(0, IDI_APPLICATION)
# 任务栏图标
flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
nid = (self.hwnd, 0, flags, WM_USER + 20, hicon, "Tooltip")
Shell_NotifyIcon(NIM_ADD, nid)
Shell_NotifyIcon(NIM_MODIFY, (self.hwnd, 0, NIF_INFO, WM_USER + 20, hicon, "Balloon Tooltip", msg, 200, title, NIIF_ICON_MASK))

# 等待一会后销毁
sleep(duration)
DestroyWindow(self.hwnd)
UnregisterClass(self.wc.lpszClassName, None)

这部分代码控制了通知弹出框的展示和销毁。如果你希望通知弹出框久一点再消失,可以适当修改传入的 duration 变量值。

DestroyWindow后,通知弹出框便消失了,整个 show_toast 的过程结束。

其实非常简单,从 CreateWindow 到 DestroyWindow 处理弹出框的各种属性,然后注销窗体,完成整个弹出流程。

3.扩展触发通知

为了扩展监听的按键,并能监听按键触发,需要先了解 notify.py 是如何检测到按键变化的。

获取按键状态:

keyboard = ctypes.WinDLL("User32.dll")
VK_NUMLOCK = 0x90
VK_CAPITAL = 0x14
def get_capslock_state():
    """Returns the current Caps Lock State(On/Off)"""
    return "Caps Lock On" if keyboard.GetKeyState(VK_CAPITAL) else "Caps Lock Off"

def get_numlock_state():
    """Returns The current Num Lock State(On/Off)"""
    return "Num Lock On" if keyboard.GetKeyState(VK_NUMLOCK) else "Num Lock Off"

可以看到,获取按键状态是通过  keyboard.GetKeyState(XXXX) 实现的。

而这个XXXX是对应的按键的十六进制,比如 VK_NUMLOCK  是Num键,对应的16进制代码是0x90, VK_CAPITAL 是大小写按键,对应的十六进制代码是0x14.

变量名是可以用户自定义的,比如大小写键有些人习惯称之为 VK_CAPITAL ,也有些人喜欢称之为  VK_CAPITAL ,都可以,只要其最终对应的变量值为十六进制的0x14即可。

部分按键16进制清单如下(完整版可以阅读原文查看):

常数名称 十六进制值 对应按键
VK_BACK 08 Backspace键
VK_TAB 09 Tab键
VK_CLEAR 0C Clear键(Num Lock关闭时的数字键盘5)
VK_RETURN 0D Enter键
VK_SHIFT 10 Shift键
VK_CONTROL 11 Ctrl键
VK_MENU 12 Alt键
VK_PAUSE 13 Pause键
VK_CAPITAL 14 Caps Lock键

再来看看监听逻辑:

caps_curr = get_capslock_state()
num_curr = get_numlock_state()

while True:
    caps_change = get_capslock_state()
    num_change = get_numlock_state()

    if caps_curr != caps_change:
        if caps_change == "Caps Lock On":
            pop_up("Caps Lock On", "CapsLock_On.ico")
        else:
            pop_up("Caps Lock Off", "CapsLock_Off.ico")
        caps_curr = caps_change
        time.sleep(0.1)

    if num_curr != num_change:
        if num_change == "Num Lock On":
            pop_up("Num Lock On", "NumLock_On.ico")
        else:
            pop_up("Num Lock Off", "NumLock_Off.ico")
        num_curr = num_change
    time.sleep(0.2)

在刚开始运行监听脚本时,先获取到按键的状态,在循环体中,不断地获得当前按键状态,如果发生了状态变化,则触发 pop_up 函数,弹出刚刚我们提到的 show_toast 函数:

def pop_up(body, icon):
    """Generates Pop-up notification when state changes"""
    notification = ToastNotifier()
    notification.show_toast("Lock Key State", body, icon_path="assets\\"+icon, duration=1.5)

整套监听并通知的机制还是非常简单的,如果我们想要自定义一些按键,你只需要在开头添加对应的按键的十六进制编码,然后添加一些监听函数。

比如我们想监听 ESC 按键被按下: VK_ESCAPE=0x1B ,使用 keyboard 模块添加一个钩子函数,监听按键:

import keyboard as kb
def hook_esc(button):
    """Alert if ESC button is pressed"""
    esc_button = kb.KeyboardEvent('down', VK_ESCAPE, 'ESC')
    if button.event_type == 'down' and esc_button.name == button.name:
        pop_up("ESC Pressed", "CapsLock_On.ico")
        # 敲击后回填为None
        button.event_type = None

然后再在循环体内添加判断逻辑:

kb.hook(hook_esc)

效果如下:

当然,图标和标题还可以进一步优化:

比如将Lock Key State这个标题用 toast_title 变量替代,默认为Lock Key State。这样在调用pop_up函数的时候就能自定义标题了,效果如下:

到此这篇关于Python制作Windows按键通知脚本的文章就介绍到这了,更多相关Python Windows按键通知内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用Python实现校园通知更新提醒功能

    前言 这个项目实已经在一个月前已经完成了,一直都想写一篇博客来总结这个过程中遇到的一些问题.但最近一个月来都比较忙,所以一直拖到了现在. 首先说说起因吧,我没事的时候,总喜欢依次点开学校主页.教务处.图书馆以及学院的网站,看看有没有什么新通知,虽然大多与我无关.恰逢最近正在学Python,经常听到别人说用Python写爬虫很简单,但自己尚未接触过爬虫.于是抱着试一试的心态看了几篇关于Python爬虫的博客,发现实现起来的确很简单.于是,便一边看着官方的文档说明,一边看着别人的博客,终于完成了自己

  • Python如何自动获取目标网站最新通知

    不管是一名学生,亦或是一名员工,我们都需要时刻注意学校或公司网站的通知,尽量做到即时获取最新消息. 大部分博客或数据资源网站都会有自己的RSS提示系统,便于将网站的最新信息及时推送给需要的用户,而用户也可以通过RSS阅读器来即时地获取到目标网站的最新内容. 由于学校或公司网站服务对象的特殊性和局限性,一般不会建立自己的RSS系统. 作为优秀的人儿,我们可以建立自己的RSS提示系统. 这里介绍了如何使用Python和常用的计算机小程序来构建一个RSS提示系统,做到定时自动检测目标网站发布的通知,并

  • 利用Python实现手机短信监控通知的方法

    日常运维工作中,通常是邮件报警机制,但邮件可能不被及时查看,导致问题出现得不到及时有效处理.所以想到用Python实现发短信功能,当监控到问题出现时,短信报警,使问题能得到及时的处理.当然,我相信,用Python发短信应用场景不止此一处,下面我们开始Python发短信的实现. 首先,看下成果展示: 然后,看下代码实现: 是不是非常简单! 现在开始具体讲解,如何实现Python发短信功能. 操作步骤 1.安装模块 twilio pip install twilio 2.申请获得twilio的API

  • python应用之如何使用Python发送通知到微信

    目录 一.通知方式有哪些? 二.如何实现企业微信通知? 1.新建应用 2.获取Secret 3.代码实现 4.实现效果: 三.参考资料 总结 一.通知方式有哪些? 常见的通知方式有:邮件,电话,短信,微信. 短信和电话:通常是收费的,较少使用: 邮件:适合带文件类型的通知,较正式,存档使用: 微信:适合告警类型通知,较方便.这里说的微信,是企业微信. 本文目的:通过企业微信应用给企业成员发消息. 二.如何实现企业微信通知? 1.新建应用 登陆网页版企业微信 (https://work.weixi

  • python实现用户登陆邮件通知的方法

    本文实例讲述了python实现用户登陆邮件通知的方法.分享给大家供大家参考.具体如下: 这里写在linux计划任务里定时执行,当有新用户登陆时候发送用户名到指定邮箱通知管理员. #!/usr/bin/env python #encoding=utf-8 from smtplib import SMTP import subprocess smtp = "smtp.qq.com" user = '1234567' password = 'xxxx' run_comd = subproce

  • Python制作Windows按键通知脚本

    目录 前言 1.准备 2.源码使用与解析 2.1 源码使用 2.2 源码分析 3.扩展触发通知 前言 对于键盘没有背光灯的同学而言,切换大小写或控制Num键开关的时候没有提示,经常需要试探性地输入一些字符来判断开关是否打开,体验非常糟糕. 因此,有人就想到自制脚本这一招,一旦触发大小写切换或Num键切换就进行windows通知提示: https://github.com/skate1512/Toggle_Keys_Notification 今天我们来试试这个脚本,此外,我们还可以基于这个项目,扩

  • Python管理Windows服务小脚本

    本文实例为大家分享了Python管理Windows服务的具体代码,供大家参考,具体内容如下 #!/usr/bin/python # encoding: utf-8 # -*- coding: utf8 -*- """ Created by PyCharm. File: LinuxBashShellScriptForOps:ServiceControl.py User: Guodong Create Date: 2016/10/14 Create Time: 17:57 Exa

  • 撤回我也能看到!教你用Python制作微信防撤回脚本

    一.之前解决方案 大概是这样:短时间内同一位好友发送了多条消息,当他随便撤回一条消息时,我们不能确定他到底撤回的到底是哪一条消息.只能猜他可能是撤回了最近的一条消息,然后将其他消息贴出来作为备选.代码如下: target_msg_pattern = '"{}" 撤回了一条消息'.format(sender_name) if content == target_msg_pattern: return_msg = '[{}]撤回了一条消息:\n'.format(sender_name) i

  • python实现windows下文件备份脚本

    在windows下用python脚本实现文件的备份,参考<A Byte of Python3>第十一章(Page59). #!/usr/bin/python # -*- coding: cp936 -*- import os import time source = ['E:\\'] # 待备份文件在E盘根目录下 running = True while running: your_source = raw_input("Your own path or your own file

  • Python制作Windows系统服务

    最近有个Python程序需要安装并作为Windows系统服务来运行,过程中碰到一些坑,整理了一下. Python服务类 首先Python程序需要调用一些Windows系统API才能作为系统服务,具体内容如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import time import win32api import win32event import win32service import win32serviceuti

  • python制作mysql数据迁移脚本

    用python写了个数据迁移脚本,主要是利用从库将大的静态表导出表空间,载导入到目标实例中. #!/usr/bin/env python3 #-*- coding:utf8 -*- #author:zhanbin.liu #!!!!!DB必须同版本 #python3环境 pip3 install pymysql paramiko import os #from pathlib import Path import sys import pymysql import paramiko #每次只能迁

  • Python实现windows下模拟按键和鼠标点击的方法

    本文实例讲述了Python实现windows下模拟按键和鼠标点击的方法.分享给大家供大家参考.具体如下: 这段代码可以模拟在窗口上按下按键.鼠标左键点击.鼠标右键点击.鼠标双击等等 # # _*_ coding:UTF-8 _*_ import win32api import win32con import win32gui from ctypes import * import time VK_CODE = { 'backspace':0x08, 'tab':0x09, 'clear':0x0

  • 使用python制作一个为hex文件增加版本号的脚本实例

    最近公司一个项目需要用到IAP升级,要求将APP的版本号在hex文件添加,于是尝试用python写一个脚本,运行之后可以自动增加版本号,并且日期都是当天的 import re import time #获取日期的数据及校验和 year = int(time.strftime("%y", time.localtime())) month = int(time.strftime("%m", time.localtime())) date = int(time.strft

  • Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)

    T00ls 每日签到是可以获取 TuBi 的,由于常常忘记签到,导致损失了很多 TuBi .于是在 T00ls 论坛搜索了一下,发现有不少大佬都写了自己的签到脚本,签到功能实现.定时任务执行以及签到提醒的方式多种多样,好羡慕啊.所以这里国光也尝试借鉴前辈们的脚本,尝试整合一个自己的自动签到脚本,因为国光有自己的服务器,所以打算使用 Linux 下的 crontab 来定时执行任务,提醒的话使用钉钉和邮件提醒基本上可以满足我的使用需求了,话不多说,下面开始脚本的编写吧. 基础签到 写代码功能得慢慢

  • Python制作脚本帮女朋友抢购清空购物车

    目录 爬取目标 工具使用 需求分析 项目思路解析 selenium安装配置 项目解析 简易源码分享 大家好,我是辣条. 辣条的一个朋友最近跟我诉苦:女朋友沉迷淘宝抢购无法自拔,大晚上不睡觉都在定时抢购,真是败家. 都是好朋友辣条肯定帮忙,不就是定时抢购,定时清空购物车嘛,这叫安排. 爬取目标 网站:淘宝 工具使用 开发工具:pycharm 开发环境:python3.7, Windows10 使用工具包:selenuim 需求分析 我们的目标是秒杀淘宝的订单,这里面有几个关键点,首先需要登录淘宝,

随机推荐