You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现直接影响其他应用?开发戒瘾隐藏指定应用功能

实现思路与分平台方案

要实现类似ScreenTime的应用拦截效果,不能只靠窗口覆盖,需要调用系统层面的API来控制其他应用的窗口状态。以下是分平台的具体实现方案:

一、Windows平台

可以用pywin32库调用Windows API来隐藏指定应用的窗口:

  1. 安装依赖:
pip install pywin32
  1. 核心代码示例:
import win32gui
import win32con

def hide_app_window(window_title):
    # 根据窗口标题查找窗口句柄
    hwnd = win32gui.FindWindow(None, window_title)
    if hwnd:
        # 隐藏窗口
        win32gui.ShowWindow(hwnd, win32con.SW_HIDE)

# 示例:隐藏记事本窗口
hide_app_window("记事本")

如果需要根据进程名查找窗口,可以结合psutil库获取进程的窗口句柄:

import psutil
import win32gui
import win32con

def hide_app_by_process_name(process_name):
    for proc in psutil.process_iter(['name', 'pid']):
        if proc.info['name'] == process_name:
            # 获取进程的所有窗口句柄
            def callback(hwnd, extra):
                if win32gui.GetWindowThreadProcessId(hwnd)[1] == proc.info['pid']:
                    extra.append(hwnd)
                return True
            hwnds = []
            win32gui.EnumWindows(callback, hwnds)
            for hwnd in hwnds:
                win32gui.ShowWindow(hwnd, win32con.SW_HIDE)

# 示例:隐藏Chrome浏览器
hide_app_by_process_name("chrome.exe")

二、macOS平台

macOS需要用pyobjc库调用Cocoa框架的API,控制应用的窗口显示状态:

  1. 安装依赖:
pip install pyobjc-framework-Cocoa pyobjc-framework-Quartz
  1. 核心代码示例:
from Cocoa import NSWorkspace
from Quartz import CGWindowListCopyWindowInfo, kCGWindowListOptionOnScreenOnly, kCGNullWindowID

def hide_app_by_bundle_id(bundle_id):
    workspace = NSWorkspace.sharedWorkspace()
    app = workspace.applicationWithBundleIdentifier_(bundle_id)
    if app:
        # 隐藏应用
        app.hide_(None)

# 示例:隐藏Safari浏览器
hide_app_by_bundle_id("com.apple.Safari")

如果需要根据应用名称查找:

def hide_app_by_name(app_name):
    workspace = NSWorkspace.sharedWorkspace()
    apps = workspace.runningApplications()
    for app in apps:
        if app.localizedName() == app_name:
            app.hide_(None)

# 示例:隐藏微信
hide_app_by_name("微信")

三、Linux平台

Linux可以用xdotool工具结合Python的subprocess调用,或者用窗口管理API实现:

  1. 先安装xdotool:
sudo apt-get install xdotool
  1. Python调用示例:
import subprocess

def hide_app_by_window_title(title):
    # 查找窗口ID并隐藏
    subprocess.run(["xdotool", "search", "--name", title, "windowminimize"])

# 示例:隐藏Firefox窗口
hide_app_by_window_title("Mozilla Firefox")

四、优化窗口覆盖方案(替代直接隐藏)

如果直接调用系统API遇到权限问题,你可以优化现有的Tk窗口覆盖方案,让它更接近ScreenTime的效果:

  • 设置窗口为全屏置顶,并禁用关闭按钮:
import tkinter as tk

root = tk.Tk()
root.attributes('-fullscreen', True)
root.attributes('-topmost', True)
# 禁用窗口装饰(标题栏、关闭按钮)
root.overrideredirect(True)

# 添加提示文本
label = tk.Label(root, text="你已设置专注模式,该应用已被拦截", font=('Arial', 20), bg='#ffcc00', fg='black')
label.pack(expand=True, fill='both')

root.mainloop()
  • 监听键盘事件,防止用户通过快捷键切换窗口,可结合pynput库实现全局按键监听。

注意:所有系统级操作都需要管理员/root权限才能生效,macOS还需要在系统设置的「隐私与安全性」中给你的Python应用授予「辅助功能」权限。

内容的提问来源于stack exchange,提问作者Ruben Sutton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:42:42