【Python】实现一个类似于Glass2k的Windows窗口透明化软件

这篇具有很好参考价值的文章主要介绍了【Python】实现一个类似于Glass2k的Windows窗口透明化软件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 背景说明

        网上看到一款Windows下的窗口透明化工具Glass2k(Glass2k官网),可以简单地通过快捷键实现任意窗口的透明化,还挺方便的,想用Python自己实现一下类似的功能。

        软件已经开源到:窗口透明化小工具开源地址

        效果图如下:

【Python】实现一个类似于Glass2k的Windows窗口透明化软件,python,python,开发语言,tkinter

二 设计实现

        工具包含以下几个模块:

        【1】用 tkinter 类实现工具的界面;

        【2】用 pystray 类实现工具最小化托盘的功能;

        【3】用pynput 类实现键盘快捷键的监听功能;

        【4】用ctypes 类实现Windows窗口透明化操作;

三 功能编写

        用GUI类包含设计中的几种功能:

【1】初始化中实现工具的主界面:

def __init__(self):
    self.root = tk.Tk()
    self.root.title('窗口透明化工具')
    self.root.geometry("400x90")
    # 当用户点击窗口右上角的关闭按钮时,Tkinter将自动发送WM_DELETE_WINDOW关闭事件。通过对其进行处理并调用self.hide_window()方法,可以改为将窗口隐藏到系统托盘中。
    # 该方法用于将程序窗口隐藏到系统托盘中而非直接退出应用程序
    self.root.protocol('WM_DELETE_WINDOW', self.hide_window)
    # 添加菜单和图标
    self.create_systray_icon()
    # 绘制界面
    frame1 = tk.Frame(self.root)
    frame1.pack(side='top')
    l1 = tk.Label(frame1,
                  text='【窗口透明化操作】点击窗口,按Ctrl + Alt + [0-9]使其透明化。\nCtrl + Alt + 1:全透明\nCtrl + Alt + 5:半透明\nCtrl + Alt + 0:全填充\n')
    l1.pack()
    # 开启键盘监听
    t = threading.Thread(target=self.new_thread_start)
    # 开启守护线程,这样在GUI意外关闭时线程能正常退出
    t.setDaemon(True)
    t.start()

【2】最小化托盘包括:创建最小化托盘图标/隐藏窗口/打开窗口/退出程序 几个方法:

"""
[1]最小化托盘
"""
def create_systray_icon(self):
    # 使用 Pystray 创建系统托盘图标
    menu = (
        pystray.MenuItem('显示', self.show_window, default=True),
        pystray.Menu.SEPARATOR,  # 在系统托盘菜单中添加分隔线
        pystray.MenuItem('退出', self.quit_window))
    image = Image.open("TPWin.ico")
    self.icon = pystray.Icon("icon", image, "图标名称", menu)
    threading.Thread(target=self.icon.run, daemon=True).start()

def hide_window(self):
    # 关闭窗口时隐藏窗口,并将 Pystray 图标放到系统托盘中
    self.root.withdraw()

def show_window(self):
    # 打开主窗口
    self.icon.visible = True
    self.root.deiconify()

def quit_window(self, icon: pystray.Icon):
    # 退出程序
    icon.stop()  # 停止 Pystray 的事件循环
    self.root.quit()  # 终止 Tkinter 的事件循环
    self.root.destroy()  # 销毁应用程序的主窗口和所有活动

【3】键盘的监听包括:监听键盘点击/监听键盘释放/启动监听线程 几个方法,其中组合键用一个无序不重复元素集来管理:

"""
[2]键盘操作
"""
def on_key_press(self, key):
    if key == keyboard.Key.alt_l or key == keyboard.Key.alt_gr:
        keys.add('Alt')
    elif key == keyboard.Key.ctrl_l or key == keyboard.Key.ctrl_r:
        keys.add('Ctrl')
    elif str(key) == r"<48>":   # ctrl + 0组合键
        keys.add('0')
    elif str(key) == r"<49>":   # ctrl + 1组合键
        keys.add('1')
    elif str(key) == r"<50>":   # ctrl + 2组合键
        keys.add('2')
    elif str(key) == r"<51>":   # ctrl + 3组合键
        keys.add('3')
    elif str(key) == r"<52>":   # ctrl + 4组合键
        keys.add('4')
    elif str(key) == r"<53>":   # ctrl + 5组合键
        keys.add('5')
    elif str(key) == r"<54>":   # ctrl + 6组合键
        keys.add('6')
    elif str(key) == r"<55>":   # ctrl + 7组合键
        keys.add('7')
    elif str(key) == r"<56>":   # ctrl + 8组合键
        keys.add('8')
    elif str(key) == r"<57>":   # ctrl + 9组合键
        keys.add('9')

    if all(k in keys for k in ['Alt', 'Ctrl', '0']):
        self.set_transparency(0)
    elif all(k in keys for k in ['Alt', 'Ctrl', '1']):
        self.set_transparency(1)
    elif all(k in keys for k in ['Alt', 'Ctrl', '2']):
        self.set_transparency(2)
    elif all(k in keys for k in ['Alt', 'Ctrl', '3']):
        self.set_transparency(3)
    elif all(k in keys for k in ['Alt', 'Ctrl', '4']):
        self.set_transparency(4)
    elif all(k in keys for k in ['Alt', 'Ctrl', '5']):
        self.set_transparency(5)
    elif all(k in keys for k in ['Alt', 'Ctrl', '6']):
        self.set_transparency(6)
    elif all(k in keys for k in ['Alt', 'Ctrl', '7']):
        self.set_transparency(7)
    elif all(k in keys for k in ['Alt', 'Ctrl', '8']):
        self.set_transparency(8)
    elif all(k in keys for k in ['Alt', 'Ctrl', '9']):
        self.set_transparency(9)

def on_key_release(self, key):
    if key == keyboard.Key.alt_l or key == keyboard.Key.alt_gr:
        keys.remove('Alt')
    elif key == keyboard.Key.ctrl_l or key == keyboard.Key.ctrl_r:
        keys.remove('Ctrl')
    elif str(key) == r"<48>":  # ctrl + 0组合键
        keys.remove('0')
    elif str(key) == r"<49>":  # ctrl + 1组合键
        keys.remove('1')
    elif str(key) == r"<50>":  # ctrl + 2组合键
        keys.remove('2')
    elif str(key) == r"<51>":  # ctrl + 3组合键
        keys.remove('3')
    elif str(key) == r"<52>":  # ctrl + 4组合键
        keys.remove('4')
    elif str(key) == r"<53>":  # ctrl + 5组合键
        keys.remove('5')
    elif str(key) == r"<54>":  # ctrl + 6组合键
        keys.remove('6')
    elif str(key) == r"<55>":  # ctrl + 7组合键
        keys.remove('7')
    elif str(key) == r"<56>":  # ctrl + 8组合键
        keys.remove('8')
    elif str(key) == r"<57>":  # ctrl + 9组合键
        keys.remove('9')
    if key == keyboard.Key.esc:
        return False  # 释放了esc 键,停止监听

def new_thread_start(self):
    key_listen_thread = keyboard.Listener(on_press=self.on_key_press, on_release=self.on_key_release)
    # 运行线程
    key_listen_thread.start()

【4】设置透明度的操作包括:设置透明度/获取当前鼠标位置(获取窗口句柄用):

"""
[3]设置透明度操作(Ctrl + Alt + [0-9])
"""
def set_transparency(self, set_tp):
    global hwnd
    hwnd = ctypes.windll.user32.WindowFromPoint(self.get_mouse_position())  # 获取窗口句柄

    p = create_string_buffer(256)
    windll.user32.GetWindowTextW(hwnd, byref(p), 256)  # 获取窗口标题
    title = str(p.raw, encoding='utf-16').strip('\x00')

    exstyle = windll.user32.GetWindowLongA(hwnd, GWL_EXSTYLE)
    exstyle |= WS_EX_LAYERED  # 使窗口具有能设置透明度的样式
    windll.user32.SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle)    # 获取窗口名
    if set_tp == 0:
        alpha = 255
    else:
        alpha = set_tp * 25
    windll.user32.SetLayeredWindowAttributes(hwnd, 0, alpha, LWA_ALPHA) # 设置透明度
    print('窗口 ' + title + ' 透明度设置为 ' + str(set_tp) + '\n')


def get_mouse_position(self):
    point = ctypes.wintypes.POINT()
    ctypes.windll.user32.GetCursorPos(ctypes.byref(point))
    return point

四 程序整合

        将上述功能整合:文章来源地址https://www.toymoban.com/news/detail-836821.html

import ctypes.wintypes
import threading
import tkinter as tk
import pystray
from PIL import Image
from pynput import keyboard
from ctypes import *


WM_CLOSE = 0x10
WM_SETTEXT = 0x0c
GWL_STYLE = -16
GWL_EXSTYLE = -20
SW_MINIMIZE = 6
SW_MAXIMIZE = 3
SW_RESTORE = 9
WS_BORDER = 0x800000
WS_CAPTION = 0xC00000 # WS_BORDER Or WS_DLGFRAME
WS_CHILD = 0x40000000
WS_CLIPCHILDREN = 0x2000000
WS_CLIPSIBLINGS = 0x4000000
WS_POPUP = 0x80000000
WS_DLGFRAME = 0x400000
WS_DISABLED = 0x8000000
WS_OVERLAPPEDWINDOW = 0xcf0000
WS_THICKFRAME = 0x40000
WS_VISIBLE = 0x10000000
WS_EX_APPWINDOW = 0x40000
WS_EX_DLGMODALFRAME = 0x1
WS_EX_ACCEPTFILES = 0x10
WS_EX_CLIENTEDGE= 0x200
WS_EX_TOOLWINDOW = 0x80
WS_EX_WINDOWEDGE = 0x100
LWA_ALPHA = 0x2;LWA_COLORKEY=0x1
WS_EX_LAYERED = 0x80000

keys = set()
hwnd = 0    # 窗口句柄

class GUI:
    def __init__(self):
        #初始化窗口

    """
    [1]最小化托盘
    """

    """
    [2]键盘操作
    """

    """
    [3]设置透明度操作(Ctrl + Alt + [0-9])
    """



if __name__ == '__main__':
    # 主界面
    TKDemo = GUI()
    TKDemo.root.mainloop()

到了这里,关于【Python】实现一个类似于Glass2k的Windows窗口透明化软件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git工具的使用(linux示例,windows类似)

    特点 git是分布式的,特点是保存本地文件的元数据(meta data,文件属性等),将本地文件所有的的元信息,记录在git repo里的.git隐藏文件夹中。 git的使用可以不用网络,因为本地版本控制仓库就在你自己机器上,每一个人就是一个完成的版本库。 只不过是最终将你的本地仓

    2024年04月11日
    浏览(37)
  • Latte:一个类似Sora的开源视频生成项目

    前段时间OpenAI发布的Sora引起了巨大的轰动,最长可达1分钟的高清连贯视频生成能力秒杀了一众视频生成玩家。因为Sora没有公开发布,网上对Sora的解读翻来覆去就那么多,我也不想像复读机一样再重复一遍了。 本文给大家介绍一个类似Sora的视频生成项目:Latte。为什么说它

    2024年03月11日
    浏览(47)
  • 用Vue仿了一个类似抖音的App

    大家好,我是 Java陈序员 。 今天,给大家介绍一个基于 Vue3 实现的高仿抖音开源项目。 关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。 douyin —— 一个基于 Vue、Vite 实现,模仿抖音的移动端短视频项目。 这个项目的作者原

    2024年04月08日
    浏览(36)
  • 一款windows的终端神奇,类似mac的iTem2

    终于找到了一款windows的终端神奇。类似mac的iTem2 来,上神器 cmder 网盘链接 提取码: 63fe cmder是一款windows的命令行工具,就是我们的linux的终端,用起来和linux的命令一样。所以我们今天要做的是安装并配置cmder cmder下载下来是一个压缩包,直接解压到自己定义的文件夹中即可。

    2024年02月10日
    浏览(38)
  • 封装一个类似微信通讯录带有字母检索功能的vue组件

    这里我们直接使用 scrollIntoView 方法 该方法将调用它的元素滚动到浏览器窗口的可见区域 element.scrollIntoView(); // 等同于element.scrollIntoView(true) element.scrollIntoView(alignToTop); //布尔参数 element.scrollIntoView(scrollIntoViewOptions); //对象参数 分析一下功能就知道很简单了。 首先需要

    2024年02月12日
    浏览(61)
  • 问大伙FPGA求职一个问题,或者有类似情况的友友们可以聊一聊

    题解 | #序列中整数去重# #include iostreamusing namespace std;//序列中   深信服测试工程师岗面经 深信服测试工程师岗面试,整体感觉不错,有一定难度。面试过程中,我发现更聚焦项目落地情况,对结果的考察   题解 | #玛雅人的密码# #include stdio.h#include iostream#   科大讯飞测试工

    2024年04月13日
    浏览(44)
  • DevExpress WinForms Pivot Grid组件,一个类似Excel的数据透视表控件(二)

    界面控件DevExpress WinForms的Pivot Grid组件是一个类似Excel的数据透视表控件,用于多维(OLAP)数据分析和跨选项卡报表。在上文中(点击这里回顾)我们介绍了DevExpress WinForms Pivot Grid组件的性能、分析服务、数据塑造能力等,本文将继续介绍该组件的其他功能,欢迎持续关注我们哦

    2024年02月04日
    浏览(55)
  • 【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统(附项目源码)

    配置 配置 效果 https://gitcode.net/unity1/3dbuildsystem 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的 点赞评论和关注 ,以便我第一时间收到反馈,你的每一次 支持 都是我不断创作的最大动力。当然如果你发现了文章中 存在错误 或者有 更好的解决方法 ,也欢

    2024年02月19日
    浏览(50)
  • 【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 2/7部分-搭建TabBar

    SwiftUI模块系列 - 已更新60篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI、SwiftUI4.0、Instagram、Firebase 运行环境: SwiftUI4.0 + Xcode14 + MacOS12.6 + iPhone Simulator iPhone 14 Pro Max 使用SwiftUI基于Firebase搭建一个类似InstagramApp 2/7部分-搭建TabBar - 效果 一、运行效果 二、项目结构图

    2024年02月08日
    浏览(40)
  • 【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建TabBar

    SwiftUI模块系列 - 已更新60篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI、SwiftUI4.0、Instagram、Firebase 运行环境: SwiftUI4.0 + Xcode14 + MacOS12.6 + iPhone Simulator iPhone 14 Pro Max 使用SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建TabBar - 效果 一、运行效果 二、项目结构图

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包