色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python 制作按鍵觸發Windows通知的腳本

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-11-01 16:09 ? 次閱讀

對于鍵盤沒有背光燈的同學而言,切換大小寫或控制Num鍵開關的時候沒有提示,經常需要試探性地輸入一些字符來判斷開關是否打開,體驗非常糟糕。

因此,有人就想到自制腳本這一招,一旦觸發大小寫切換或Num鍵切換就進行windows通知提示:

https://github.com/skate1512/Toggle_Keys_Notification

今天我們來試試這個腳本,此外,我們還可以基于這個項目,擴展成任意一個按鍵被觸發或切換都進行 windows 通知的腳本:

圖片

1.準備

開始之前,你要確保Pythonpip已經成功安裝在電腦上,如果沒有,請訪問這篇文章:超詳細Python安裝指南 進行安裝。如果你用Python的目的是數據分析,可以直接安裝Anaconda:Python數據分析與挖掘好幫手—Anaconda,它內置了Python和pip.

此外,推薦大家用VSCode編輯器,因為它可以在編輯器下方的終端運行命令安裝依賴模塊:Python 編程的最好搭檔—VSCode 詳細指南

Windows環境下打開 Cmd (開始-運行-CMD),蘋果系統環境下請打開 Terminal (command+空格輸入Terminal),輸入命令安裝依賴:

pip install win10toast

除此之外,我們需要下載作者的代碼,如果你能聯通GitHub,請前往以下地址下載:
https://github.com/skate1512/Toggle_Keys_Notification

如果不能聯通GitHub,或者網絡速度比較慢,請在Python實用寶典公眾號后臺回復:按鍵觸發通知 下載本文完整源代碼。

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 這個函數具有非常多的參數,甚至有一個百度百科來詳細解析每一個參數的具體作用,大家感興趣可以移步:
https://baike.baidu.com/item/CreateWindow/5076220

了解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_BACK08Backspace鍵
VK_TAB09Tab鍵
VK_CLEAR0CClear鍵(Num Lock關閉時的數字鍵盤5)
VK_RETURN0DEnter鍵
VK_SHIFT10Shift鍵
VK_CONTROL11Ctrl鍵
VK_MENU12Alt鍵
VK_PAUSE13Pause鍵
VK_CAPITAL14Caps 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
    +關注

    關注

    3

    文章

    3541

    瀏覽量

    88635
  • 鍵盤
    +關注

    關注

    4

    文章

    859

    瀏覽量

    39649
  • python
    +關注

    關注

    56

    文章

    4793

    瀏覽量

    84634
  • 腳本
    +關注

    關注

    1

    文章

    389

    瀏覽量

    14860
收藏 人收藏

    評論

    相關推薦

    基于Python腳本的R語言的函數

    本文介紹了采用創建一個Python腳本,用該腳本模仿R風格的函數的方法來方便地進行統計。 是用R語言還是用Python語言?這是一個曠日持久的爭論。在此,我們可以嘗試采用折中路線:創建
    的頭像 發表于 10-12 09:33 ?2105次閱讀
    基于<b class='flag-5'>Python</b><b class='flag-5'>腳本</b>的R語言的函數

    10個殺手級的Python自動化腳本

    今天浩道跟大家分享10個日常工作中用到的python自動化腳本。讓你感受一番python簡單強大之處!
    發表于 11-28 11:07 ?682次閱讀

    13個用于日常編程的高級Python腳本

    今天浩道跟大家分享13個用于日常編程的高級python腳本。讓你不會寫腳本的也能感受到其魅力!
    發表于 12-09 11:47 ?622次閱讀

    制作Windows按鍵通知腳本

    對于鍵盤沒有背光燈的同學而言,切換大小寫或控制Num鍵開關的時候沒有提示,經常需要試探性地輸入一些字符來判斷開關是否打開,體驗非常糟糕。
    的頭像 發表于 02-24 10:39 ?2134次閱讀
    <b class='flag-5'>制作</b><b class='flag-5'>Windows</b><b class='flag-5'>按鍵</b><b class='flag-5'>通知</b><b class='flag-5'>腳本</b>

    在執行setupvars.bat腳本以初始化Windows10中OpenVINO環境時,提示未安裝Python怎么解決?

    在執行 setupvars.bat 腳本以初始化 Windows? 10 中OpenVINO?環境時,遇到以下錯誤消息: 未安裝 Python
    發表于 08-15 06:52

    如何在 IIS 中執行 Python 腳本

    如何在 IIS 中執行 Python 腳本 Python 是一種解釋腳本語言,概念類似 Microsoft Visual Basic Scripting Edition (VBSc
    發表于 02-23 15:13 ?1258次閱讀

    如何使html網頁與python腳本進行通信

    現在運行python腳本并轉到http://localhost/或http://localhost/并開始按下按鈕,您應該會在python腳本上看到輸入。
    的頭像 發表于 11-04 10:12 ?7872次閱讀

    Python】如何將Python腳本打包成exe可執行文件

    Python實用技巧】如何將Python腳本打包成exe可執行文件?
    的頭像 發表于 08-18 12:40 ?1.8w次閱讀
    【<b class='flag-5'>Python</b>】如何將<b class='flag-5'>Python</b><b class='flag-5'>腳本</b>打包成exe可執行文件

    通過Python腳本實現WIFI密碼的暴力破解

    本文將記錄學習下如何通過 Python 腳本實現 WIFI 密碼的暴力破解。
    的頭像 發表于 09-19 09:55 ?6713次閱讀

    python3中制作腳本處理步進電機沿滑軌和滾珠絲杠的運動

    電子發燒友網站提供《在python3中制作腳本處理步進電機沿滑軌和滾珠絲杠的運動.zip》資料免費下載
    發表于 11-02 09:33 ?0次下載
    在<b class='flag-5'>python</b>3中<b class='flag-5'>制作</b><b class='flag-5'>腳本</b>處理步進電機沿滑軌和滾珠絲杠的運動

    【shell腳本分享】性能指標監控與通知

    今天浩道跟大家分享一個關于性能監控與通知相關的shell腳本
    的頭像 發表于 01-09 09:35 ?1140次閱讀

    Python怎么玩轉JS腳本

    本項目旨在讓大家了解如何用Python來執行JS腳本,其主要目的是在進行數據 分析時,需要利用爬蟲獲取數據,有時會遇到JS混淆加密反爬取難點,此時我們需 要獲取網頁JS加密代碼將其轉換為Python代碼運行,從而破解JS加密
    的頭像 發表于 02-23 16:26 ?1113次閱讀
    <b class='flag-5'>Python</b>怎么玩轉JS<b class='flag-5'>腳本</b>

    Python簡單制作Windows按鍵通知腳本

    ,擴展成任意一個按鍵觸發或切換都進行 windows 通知腳本: 1.準備 開始之前,你要確保Pyt
    的頭像 發表于 10-17 11:10 ?667次閱讀
    <b class='flag-5'>Python</b>簡單<b class='flag-5'>制作</b><b class='flag-5'>Windows</b><b class='flag-5'>按鍵</b><b class='flag-5'>通知</b><b class='flag-5'>腳本</b>

    Python超簡單制作Windows按鍵通知腳本

    ,擴展成任意一個按鍵觸發或切換都進行 windows 通知腳本: 1.準備 1.準備 開始之前,你要確保
    的頭像 發表于 11-01 09:24 ?462次閱讀
    <b class='flag-5'>Python</b>超簡單<b class='flag-5'>制作</b><b class='flag-5'>Windows</b><b class='flag-5'>按鍵</b><b class='flag-5'>通知</b><b class='flag-5'>腳本</b>

    python調用windows命令

    Python是一種強大的編程語言,可以用于開發各種不同類型的應用程序。其中一個常見的用途是使用Python調用Windows命令來執行特定的任務。在本文中,我們將詳細討論如何使用Python
    的頭像 發表于 11-29 14:34 ?1048次閱讀
    主站蜘蛛池模板: 超碰免费碰免费视频| 视频成人永久免费下载| 国语自产视频在线| 高跟丝袜岳第一次| 成人免费肉动漫无遮网站| 99久久精品国产国产毛片| 在线 自拍 综合 亚洲 欧美| 亚洲另类欧美综合在线| 亚洲、国产综合视频| 午夜免费小视频| 丝袜足控免费网站xx91| 色综合久久中文色婷婷| 涩涩伊人久久无码欧美| 日日天干夜夜狠狠爱| 日日碰狠狠躁久久躁77777| 肉耽高h一受n攻| 婷婷精品国产亚洲AV在线观看| 肉欲横流(NP高H)| 日本特殊精油按摩| 日韩精品欧美亚洲高清有无| 日韩精品 中文字幕 有码| 日韩 国产 欧美视频二区| 日美一级毛片| 丝袜诱惑qvod| 性吧 校园春色| 亚洲精品在线看| 一级毛片在线免费视频| 中文天堂www资源| 91免费精品国自产拍在线可以看| 97人妻碰视频在线观看| xxxx18动漫| 国产69精品9999XXXX| 国产精品色无码AV在线观看| 国产午夜精品一区二区理论影院| 狠狠插影院| 看电影就来5566先锋av| 欧美xxxx印度| 日日夜夜国产| 亚洲精品中文字幕无码A片蜜桃| 伊人国产在线视频| 99热热在线精品久久|