吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 38942|回复: 614
收起左侧

[Windows] 闲来无事,写了一个简单的摸鱼工具

    [复制链接]
gzsklsskszngc 发表于 2024-6-24 18:24
本帖最后由 gzsklsskszngc 于 2024-8-5 18:19 编辑

废话不多说,直接上代码。
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk
import win32gui
import win32process
import win32con
import psutil
import keyboard
import threading
 
class WindowController:
    def __init__(self, root):
        self.root = root
        self.root.title("窗口控制工具v1.5")
        self.root.geometry("300x150")
 
        self.original_styles = {}  # 存储窗口原始样式的字典
        self.is_visible = True  # 主窗口可见性标志
 
        self.create_widgets()  # 创建图形界面组件
 
        self.root.protocol("WM_DELETE_WINDOW", self.on_close)  # 绑定窗口关闭事件
 
        self.root.bind("<Unmap>", self.on_minimize)  # 覆盖默认的最小化行为
 
        self.update_process_list()  # 更新进程列表
 
        self.running = True
        # 创建线程来等待热键按下
        threading.Thread(target=self.wait_hotkey).start()

    def wait_hotkey(self):
        while self.running:
            keyboard.wait('ctrl+alt+h')
            self.toggle_window()
 
    def create_widgets(self):
        # 创建进程选择标签
        self.process_label = tk.Label(self.root, text="选择进程:")
        self.process_label.pack()
 
        # 创建进程选择下拉列表
        self.process_dropdown = ttk.Combobox(self.root, state='readonly')
        self.process_dropdown.pack()
 
        # 创建隐藏按钮
        self.hide_button = tk.Button(self.root, text="隐藏", command=self.hide_process)
        self.hide_button.pack()
 
        # 创建恢复按钮
        self.restore_button = tk.Button(self.root, text="恢复", command=self.restore_process)
        self.restore_button.pack()
 
        # 创建刷新进程列表按钮
        self.refresh_button = tk.Button(self.root, text="刷新进程列表", command=self.update_process_list)
        self.refresh_button.pack()
 
        # 设置快捷键
        keyboard.add_hotkey('ctrl+1', self.hide_process)
        keyboard.add_hotkey('ctrl+2', self.restore_process)
 
    def toggle_window(self):
        # 切换主窗口可见性
        if self.is_visible:
            self.root.withdraw()
            self.is_visible = False
        else:
            self.root.deiconify()
            self.root.focus_force()
            self.is_visible = True
 
    def on_close(self):
        # 处理窗口关闭事件
        self.root.withdraw()
        self.is_visible = False
 
    def on_minimize(self, event):
        # 处理窗口最小化事件
        self.root.withdraw()
        self.is_visible = False
 
    def update_process_list(self):
        # 更新进程列表
        processes = [proc.name() for proc in psutil.process_iter(['pid', 'name'])]
        self.process_dropdown['values'] = list(set(processes))
 
    def hide_windows(self, process_name):
        # 隐藏指定进程的所有窗口
        for proc in psutil.process_iter(['pid', 'name']):
            if proc.name() == process_name:
                pid = proc.info['pid']
                self.hide_windows_by_pid(pid)
 
    def hide_windows_by_pid(self, pid):
        # 隐藏指定进程ID的所有窗口
        def callback(hwnd, whdls):
            if win32gui.IsWindowVisible(hwnd):
                _, found_pid = win32process.GetWindowThreadProcessId(hwnd)
                if found_pid == pid:
                    whdls.append(hwnd)
                    self.original_styles[hwnd] = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
                    win32gui.ShowWindow(hwnd, 0)
                    win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, self.original_styles[hwnd] & ~win32con.WS_VISIBLE)
 
        hwnds = []
        win32gui.EnumWindows(callback, hwnds)
 
    def restore_windows(self, process_name):
        # 恢复指定进程的所有窗口
        for proc in psutil.process_iter(['pid', 'name']):
            if proc.name() == process_name:
                pid = proc.info['pid']
                self.restore_windows_by_pid(pid)
 
    def restore_windows_by_pid(self, pid):
        def callback(hwnd, _):
            try:
                _, found_pid = win32process.GetWindowThreadProcessId(hwnd)
                if found_pid == pid:
                    # 尝试多种方法恢复窗口
                    win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
                    win32gui.SetWindowPos(hwnd, win32con.HWND_TOP, 0, 0, 0, 0, 
                                          win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_SHOWWINDOW)
                    win32gui.SetForegroundWindow(hwnd)
                    win32gui.RedrawWindow(hwnd, None, None, 
                                          win32con.RDW_INVALIDATE | win32con.RDW_ERASE | win32con.RDW_FRAME |     win32con.RDW_ALLCHILDREN)
            except Exception as e:
                logging.error(f"Error restoring window: {e}")

        win32gui.EnumWindows(callback, None)

    def refresh_window_handles(self):
        for proc in psutil.process_iter(['pid', 'name']):
            if proc.name() in self.hidden_processes:
                self.hide_windows_by_pid(proc.info['pid'])
    
        # 每5分钟刷新一次
        self.root.after(300000, self.refresh_window_handles)

    def hide_process(self):
        # 隐藏选定进程的窗口
        process_name = self.process_dropdown.get()
        if process_name:
            self.hide_windows(process_name)
 
    def restore_process(self):
        # 恢复选定进程的窗口
        process_name = self.process_dropdown.get()
        if process_name:
            self.restore_windows(process_name)
 
if __name__ == "__main__":
    root = tk.Tk()
    app = WindowController(root)
    root.mainloop()

0313cd71fdd3f.png

使用方法:
1.运行.py程序
2.指定需要隐藏的窗口进程
3.按快捷键ctrl+z隐藏窗口,按ctrl+x恢复窗口
4.最小化本软件
点击隐藏后窗口不会在任务栏显示,点击最小化后本软件也会在任务栏消失
需要修改快捷键的可以自己在代码里改
没有库的自己根据提示安装
必须有ico图标文件才能运行
程序最小化后可在托盘右键呼出菜单

2024/06/25更新
修复最小化后主程序没有在任务栏隐藏的BUG

2024/07/06更新
去除系统托盘显示,增加隐藏主程序的功能,现在无论点最小化还是关闭,主程序都会消失不见,进程里也看不到了。如果要关闭的话得呼出主程序,然后在任务管理器里结束掉任务就可以了。按快捷键ctrl+Alt+H可以呼出。
成品链接
https://www.lanzoub.com/iAsWC23oaive

2024/07/10更新
有网友反应程序有时候无法恢复,猜测可能窗口被吞了,本次更新在恢复窗口时强制将其设为前台,避免被其他窗口吞掉。
去除必须自带ico图标文件才能运行
https://wwd.lanzoub.com/isfNv2432ali


2024/07/31更新
增强恢复逻辑,让程序运行更稳定。
https://wwd.lanzoub.com/ib5Ql261veje


2024/08/05更新
增强主程序唤醒,现在偶尔无法唤醒的问题解决了。
修改快捷键
ctrl+1隐藏
ctrl+2显示
https://wwd.lanzoub.com/iX14v26mc7kf



免费评分

参与人数 166吾爱币 +150 热心值 +145 收起 理由
nekoparapoi + 1 + 1 热心回复!
q935849597 + 2 + 1 我很赞同!
xielj520 + 1 + 1 我很赞同!
wkpaihjj + 1 + 1 谢谢@Thanks!
唔来也 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhangfm1987 + 1 + 1 我很赞同!
qianxun123 + 1 谢谢@Thanks!
wangjin1215 + 1 + 1 热心回复!
xingruzi + 1 + 1 我很赞同!
假过卖喵 + 1 我很赞同!
UGLY666 + 1 谢谢@Thanks!
苍白之白 + 1 + 1 谢谢@Thanks!
xzkr + 1 + 1 谢谢@Thanks!
zjl1229 + 1 + 1 谢谢@Thanks!
1391230369 + 1 + 1 真好
saver222 + 1 + 1 我很赞同!
renyi66666 + 1 + 1 谢谢@Thanks!
Cleverwwh + 1 + 1 我很赞同!
msetd21 + 1 + 1 我很赞同!
wenjie9913 + 1 + 1 我很赞同!
1248827423 + 1 用心讨论,共获提升!
搞点什么 + 1 + 1 谢谢@Thanks!
250160622 + 1 谢谢@Thanks!
visin1799 + 1 谢谢@Thanks!
zw0471123 + 1 + 1 谢谢@Thanks!
大肥猪 + 1 + 1 谢谢@Thanks!
zhanget3 + 1 + 1 我很赞同!
dengyu1116 + 1 + 1 热心回复!
nonwoo + 1 谢谢@Thanks!
muzhiiii + 1 谢谢@Thanks!
Ouyang520 + 1 谢谢@Thanks!
crazy_hb + 1 + 1 为这功能花过30买。还不好用。。。感谢。。
studyhard1999 + 1 我很赞同!
zgvbb + 1 + 1 谢谢@Thanks!
xiaoguai0121 + 1 + 1 谢谢@Thanks!
lntano313 + 1 我很赞同!
bailiang520 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
mersky + 1 + 1 谢谢@Thanks!
xtssh87127 + 1 + 1 我很赞同!
LLzz2023 + 1 + 1 我很赞同!
sv1997 + 1 + 1 我很赞同!
xingwu2 + 1 + 1 热心回复!
louchen94 + 1 + 1 我很赞同!
Ehtrs + 1 我很赞同!
nicaini + 1 + 1 谢谢@Thanks!
jy138290 + 1 + 1 谢谢@Thanks!
inLDran + 1 谢谢@Thanks!
will06 + 1 + 1 热心回复!
lyslxx + 1 + 1 我很赞同!
我本是一介书生 + 1 搭配鼠标侧键使用
xi12345621 + 1 + 1 谢谢@Thanks!
woxobo + 1 + 1 谢谢@Thanks!
qqqier + 1 + 1 谢谢@Thanks!
Charliekim14725 + 1 + 1 谢谢@Thanks!
heiyue003 + 1 + 1 我很赞同!
晚风吹麦浪 + 1 谢谢@Thanks!
jackliu99 + 1 + 1 热心回复!
书虫吾爱 + 1 + 1 谢谢@Thanks!
tvrcfdfe + 1 + 1 我很赞同!
一步梦想 + 1 + 1 大家一起摸鱼!
主骑士 + 1 + 1 我愿称之为神作
ma4907758 + 1 谢谢@Thanks!
opopbear + 1 + 1 谢谢@Thanks!
lu6xueqi + 1 + 1 谢谢@Thanks!
zk20120707 + 1 + 1 我很赞同!
ind + 1 + 1 用心讨论,共获提升!
maiwens + 1 + 1 谢谢@Thanks!
wangyongdesign + 1 + 1 谢谢@Thanks!
LeaCHN + 1 + 1 谢谢@Thanks!
jackyyue_cn + 1 + 1 谢谢@Thanks!
princekin + 1 + 1 谢谢@Thanks!
a45723929 + 1 + 1 我很赞同!
mengsiyiren + 1 + 1 我很赞同!
hotc + 1 + 1 谢谢@Thanks!
天涯89 + 1 + 1 虽然没看懂,但是感觉好厉害
zj_tj + 1 + 1 热心回复!
2022313 + 1 说到摸鱼,我就精神了
jsyczxyh + 1 我很赞同!
假装在伦敦 + 1 + 1 谢谢@Thanks!
alexxi0571 + 1 谢谢@Thanks!
Alexvictor + 1 我很赞同!
Grox9426 + 1 + 1 我很赞同!
lccccccc + 1 + 1 我很赞同!
liu913534573 + 1 + 1 谢谢@Thanks!
liupin924 + 1 热心回复!
丶陈先森 + 1 热心回复!
Mrli007 + 1 热心回复!
lyw8614505 + 1 + 1 拜托大佬弄个32位系统用的
aipiaoxu + 1 + 1 用心讨论,共获提升!
lj113590797 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xn213 + 1 鼓励转贴优秀软件安全工具和文档!
神精小子 + 1 + 1 我很赞同!
默罕默德三打哈 + 1 + 1 谢谢@Thanks!
jnzj4811 + 1 + 1 谢谢@Thanks!
eq2ch3 + 1 + 1 谢谢@Thanks!
ly19810529 + 1 + 1 谢谢@Thanks!
killer1424 + 1 + 1 谢谢@Thanks!
nokai + 1 谢谢@Thanks!
iTMZhang + 1 谢谢@Thanks!
lzx629888 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| gzsklsskszngc 发表于 2024-7-6 19:56
忘记了说,隐藏主程序后进程里也看不到了。如果要关闭的话得呼出主程序,然后在任务管理器里结束掉任务就可以了。
zj19970417 发表于 2024-6-24 19:27
52628975 发表于 2024-6-24 18:48
能不能上快捷键,每个快捷键设置对应的一个软件,或者快捷键关闭最近打开的一个
winxpnt 发表于 2024-6-24 20:08
我也来捞钱看看
anorith 发表于 2024-6-24 19:14
楼主nb,这个工具值得使用
TJYYWXBG 发表于 2024-7-1 17:50
quicker里面有很多作者开发了这个隐藏窗口的动作
 楼主| gzsklsskszngc 发表于 2024-8-5 18:22
ztear 发表于 2024-6-24 23:36
如何隐藏进程?

后续会推出隐藏进程,且可以操作多程序。
luo_88 发表于 2024-6-24 18:47
谢谢,楼主分享
zlqhysy 发表于 2024-6-24 19:37
摸鱼,正好弄点下酒菜
wuyc171224 发表于 2024-6-24 19:48
摸鱼神器呀
374284058 发表于 2024-6-24 19:55
谢谢 摸鱼神器呀
xin1you1di1 发表于 2024-6-24 19:58
楼主nb,这个工具值得使用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 05:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表