在日常工作和学习中,我们经常需要快速访问某些功能或资源,例如打开常用网站、启动应用程序或执行特定命令。Linux 用户可以通过 alias 快速实现这些操作,但在 Windows 上缺乏类似的原生支持。本文将介绍如何使用 Python 开发一个 隐藏式文本输入框程序,模拟 Linux 的 alias 功能,实现快速启动和访问。


功能概述

该程序的核心功能如下:

  1. 隐藏式界面:默认情况下,程序界面隐藏,按下热键后显示。

  2. 快速输入:通过键盘输入关键字,按下回车键后执行相应操作。

  3. 自定义映射:通过配置文件(如 store.txt)定义关键字与操作的映射关系。

  4. 快速打开网站:输入关键字后,自动打开对应的 URL。

  5. 打开文件夹:输入关键字后,打开指定的文件夹。

  6. 启动应用程序:输入关键字后,启动指定的应用程序。

  7. 执行系统命令:输入关键字后,执行系统命令(如打开服务管理器)。

  8. 单实例运行:确保程序只运行一个实例,避免重复启动。


实现原理

1. 隐藏式界面

使用 tkinter 创建一个无标题栏的文本输入框界面,默认隐藏。通过全局热键(如 Alt + Win + Z)显示界面,并将焦点设置到输入框。

2. 关键字映射

通过读取配置文件(如 store.txt),将关键字与操作(如 URL、文件夹路径、应用程序路径或系统命令)关联起来。例如:

 
google https://www.google.com u
python https://www.python.org u
ubunt D:\ubunt f
services %SystemRoot%\system32\services.msc o
notepad C:\Windows\System32\notepad.exe o

3. 快速执行

输入关键字后,按下回车键,程序会根据配置文件执行相应操作(如打开浏览器访问 URL、打开文件夹、启动应用程序或执行系统命令)。

4. 单实例运行

使用 psutil 检查程序是否已经运行,避免重复启动。


代码实现

以下是完整的 Python 代码:

python
复制
import tkinter as tk
import keyboard
import ctypes
import sys
import os
import psutil
import webbrowser
import subprocess
import time class StoreItem:
def __init__(self, keyword, content, type_):
self.keyword = keyword
self.content = content
self.type_ = type_ class Store:
def __init__(self, file_path):
self.file_path = file_path
self.items = {}
self.last_modified = 0
self.load() def load(self):
if not os.path.exists(self.file_path):
print(f"错误:未找到文件 {self.file_path},请确保 store.txt 和脚本在同一目录下。")
return self.last_modified = os.path.getmtime(self.file_path)
self.items.clear() with open(self.file_path, "r", encoding="utf-8") as file:
for line in file:
columns = line.strip().split()
if len(columns) == 3:
keyword, content, type_ = columns
self.items[keyword] = StoreItem(keyword, content, type_) def get_item(self, keyword):
if os.path.getmtime(self.file_path) > self.last_modified:
self.load()
return self.items.get(keyword) def is_already_running():
current_pid = os.getpid()
for proc in psutil.process_iter(['pid', 'name']):
try:
if proc.info['name'] == os.path.basename(sys.argv[0]) and proc.info['pid'] != current_pid:
return True
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
return False if is_already_running():
print("程序已经在运行中,退出当前实例。")
sys.exit(0) user32 = ctypes.windll.user32
imm32 = ctypes.windll.imm32 def show_window():
if not root.winfo_viewable():
root.deiconify()
root.lift()
root.focus_force()
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
window_width = root.winfo_reqwidth()
window_height = root.winfo_reqheight()
x = screen_width - window_width - 20
y = 20
root.geometry(f"+{x}+{y}")
text_entry.focus_set()
text_entry.delete(0, tk.END)
switch_to_english() def hide_window():
root.withdraw() def on_enter(event):
input_text = text_entry.get()
if input_text.strip():
ontext(input_text)
text_entry.delete(0, tk.END)
hide_window() def handle_action(item):
if item.type_ == "u":
webbrowser.open(item.content)
print(f"已打开 URL: {item.content}")
elif item.type_ == "f":
os.startfile(item.content)
print(f"已打开文件夹: {item.content}")
elif item.type_ == "o":
subprocess.run(item.content, shell=True)
print(f"已执行命令: {item.content}") def ontext(key):
item = store.get_item(key)
if item:
handle_action(item)
else:
print(f"未找到关键字为 {key} 的记录。") def switch_to_english():
hwnd = user32.GetForegroundWindow()
himc = imm32.ImmGetContext(hwnd)
if himc:
imm32.ImmSetOpenStatus(himc, False)
imm32.ImmReleaseContext(hwnd, himc) root = tk.Tk()
root.overrideredirect(True)
root.configure(bg="white") text_entry = tk.Entry(
root,
width=20,
font=("Arial", 12),
bd=0,
highlightthickness=1,
justify="left"
)
text_entry.pack(padx=10, pady=10) root.withdraw() text_entry.bind("<Return>", on_enter)
keyboard.add_hotkey("alt+windows+z", show_window)
keyboard.add_hotkey("esc", hide_window)
text_entry.bind("<FocusIn>", lambda event: switch_to_english()) script_dir = os.path.dirname(os.path.abspath(__file__))
store_path = os.path.join(script_dir, "store.txt")
store = Store(store_path) root.mainloop()

配置文件示例

在 store.txt 文件中添加以下内容:

google https://www.google.com u
python https://www.python.org u
ubunt D:\ubunt f
services %SystemRoot%\system32\services.msc o
notepad C:\Windows\System32\notepad.exe o
 


功能说明

  1. 打开 URL

    • 输入 google,打开 https://www.google.com

    • 输入 python,打开 https://www.python.org

  2. 打开文件夹

    • 输入 ubunt,打开 D:\ubunt 文件夹。

  3. 启动应用程序或执行系统命令

    • 输入 services,打开服务管理器。

    • 输入 notepad,启动记事本。


使用方法

  1. 将 Python 脚本和 store.txt 文件放在同一目录下。

  2. 运行 Python 脚本。

  3. 按下 Alt + Win + Z 显示界面,输入关键字后按 Enter 键。

  4. 程序会根据配置文件执行相应操作。


打包为可执行文件

使用 PyInstaller 将脚本打包为 Windows 可执行文件:

bash
复制
pyinstaller --onefile --windowed main.py

生成的 main.exe 文件位于 dist 文件夹中。


总结

通过抽象 StoreItem 和 Store 类,代码逻辑更加清晰和模块化。快速启动器 不仅支持打开网址,还能打开文件夹、启动应用程序和执行系统命令。你可以根据需要在 store.txt 中添加更多映射关系,实现快速访问常用资源的目标。希望这个工具能帮助你提高工作效率!

 
 

Windows 快速启动器的更多相关文章

  1. [windows]快速从ftp下载最新软件包的批处理脚本

    背景 由于敏捷开发,快速迭代,我们项目一天会有三个版本,也就意味着我一天要去获取三次软件包.我负责服务端开发,所以我经常需要去拿最新的客户端.我们的客户端放置在一个公共的ftp上面.每天频繁登陆ftp ...

  2. Windows Phone 启动器

    http://msdn.microsoft.com/zh-CN/library/gg278408(v=vs.92)#BKMK_Launchers using Microsoft.Phone.Contr ...

  3. vc++ windows 快速启动栏创建快捷方式

    创建快速启动栏 在windows软件开发中,软件安装过程中总是需要在快速启动栏创建快捷方式,下面介绍一种快速启动栏创建快捷方式的方法,具体代码如下:(该方法不支持win10,目前还没有找到win10的 ...

  4. windows——快速得到某一目录下所有文件的名称

    前言 其实用的是windows上dir命令,能快速得到某一目录下的所有文件名称,天天那么忙都没时间写博客(┬_┬) 步骤 打开cmd并cd到某目录下 C:\Users\Administrator.KI ...

  5. windows快速搭建FTP工具Serv-U FTP Server

    本文介绍一个简单的FTP工具,当然windows系统自带FTP工具,但是配置方法没有第三方工具来的简单可操作性好. 此工具用于搭建FTP环境,对于需要测试FTP上传功能具有极大帮助.例如球机抓拍图片上 ...

  6. Windows快速批量删除大量文件的命令

    命令分别如下: rmdir [drive:]path [/S] [/Q] del [drive:]path [/S] [/Q] 其中rmdir 与rd命令相同. /S 表示除目录本身外,还将删除指定目 ...

  7. Ubuntu Linux虚拟机与windows快速创建共享文件夹

    有时候我们需要在windows下与远程Linux服务器传输文件,之前使用pscp传输文件很方便,但不方便传输多文件,同时也不便于查看.看了网上的教程总结创建共享文件夹的流程: 1.首先在本地windo ...

  8. windows快速安装redis

    下载地址:https://github.com/microsoftarchive/redis/releases 下载解压,命令行:redis-server.exe redis.windows.conf

  9. windows快速安装linux虚拟机

    1. 场景描述 因测试中需要linux集群,目前的服务器不太方便部署,需要本机(windows7)启动多个linux虚拟机,记录下,希望能帮到需要的朋友. 2. 解决方案 2.1 软件准备 (1)使用 ...

  10. 【好软推荐】Scoop - Windows快速软件安装指南

    在平常生活中如果要安装像git.java.node这些环境的时都需要先去官网下载安装程序,点击安装,之后还需要配置,不仅过程麻烦,而且工具多了之后整理起来也相当不容易,配置也很杂,整个电脑就像被污染了 ...

随机推荐

  1. Nuxt.js 应用中的 schema:written 事件钩子详解

    title: Nuxt.js 应用中的 schema:written 事件钩子详解 date: 2024/11/15 updated: 2024/11/15 author: cmdragon exce ...

  2. php 异步并行后续--兼容FPM使用的组件

    上次给人推荐了这篇文章,关于PHP异步并行的文章,之后有人评论问这个组件能不能给fpm用,我测试了一下发现不行,于是又找到一个可以给fpm用的http请求组件. 安装很简单,就这样  composer ...

  3. BeanStalkd 做队列服务

    今天无意间看到这个仓库讲php关于 BeanStalkd 的扩展,然后就去了解了一下beanstalkd,才知道它可以用来做队列服务. 话不多说,安装一下试试. 首先 sudo apt search ...

  4. Java通用分页

    一. 要分页我们必须要有数据库,所以我们先准备下数据库,其数据库脚步如下: --以下是创建数据库和数据库表以及向数据库插入数据  use master   Go   if exists(select ...

  5. Postman 汉化教程

    Postman 汉化教程(Postman中文版) 迷恋自留地 postman官网下载地址 https://www.postman.com/downloads/ postman汉化包 https://g ...

  6. 19号CSS学习

    一.CSS的复合选择器 更高效的选择目标元素. 后代选择器.子选择器.并集选择器.伪类选择器等. 1.后代选择器 可以选择父元素里的子元素. 又称包含选择器. 必须是空格,必须是后代,ul li {c ...

  7. 【分块】LibreOJ 6278 数列分块入门2

    题目 https://loj.ac/p/6278 题解 将 \(n\) 个元素的数组 \(a\) 按块长 \(\sqrt{n}\) 进行分块处理.为每个块设置一个懒添加标记 \(add[i]\),代表 ...

  8. 【巧用set实现对有序数组O(logn)时间复杂度增、删、查、改、二分操作】codeforces 1041 C. Coffee Break

    题意 第一行输入三个整数 \(n,m,d(1 \leq n \leq 2 * 10^5, n \leq m \leq 10^9, 1 \leq d \leq n)\),第二行输入 \(n\) 个整数, ...

  9. 鸿蒙UI系统组件01——文本组件(Text/Span)

    如果你也对鸿蒙开发感兴趣,加入"Harmony自习室"吧!点击下面的名片关注公众号. 1.概述 Text是文本组件,是我们开发UI界面中最常见的组件之一,通常用于展示用户的视图,如 ...

  10. windows安装tomcat10

    ​下载安装jdk17 :jdk-17_windows-x64_bin.exe 配置JAVA环境变量 JAVA_HOME:C:\Program Files\Java\jdk-17 PATH:%Java_ ...