我刚刚大炮打蚊子,用 ahk,windows 命令面板,python 做了个我想要的窗口切换器
复制
import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QListWidget, QVBoxLayout, QLineEdit, QWidget, QFrame) from PyQt5.QtCore import Qt, QEvent from PyQt5.QtWidgets import QDesktopWidget import pyautogui import pyperclip import time def powertoy_active_window(text): sleep_second = 0.2 time.sleep(sleep_second) pyautogui.hotkey("win", "alt", "k") time.sleep(sleep_second) pyperclip.copy(text) pyautogui.hotkey("ctrl", "v") time.sleep(sleep_second) pyautogui.hotkey("enter") class CommandPalette(QWidget): def __init__(self, parent=None): super().__init__(parent) # 1. 设置 UI 属性:无边框、置顶、背景透明 self.setWindowFlags(Qt.FramelessWindowHint | Qt.Dialog) self.setAttribute(Qt.WA_TranslucentBackground) # 外层容器(用于实现圆角和边框) self.container = QFrame(self) self.container.setFixedWidth(500) self.container.setStyleSheet(""" QFrame { background-color: #252526; border: 1px solid #454545; border-radius: 6px; } """) layout = QVBoxLayout(self.container) # 2. 搜索输入框 self.search_bar = QLineEdit() self.search_bar.setPlaceholderText("键入命令名称以筛选...") self.search_bar.setStyleSheet(""" QLineEdit { background-color: #3c3c3c; color: #cccccc; border: 1px solid #007acc; padding: 6px; font-size: 14px; selection-background-color: #264f78; } """) # 3. 命令列表 self.list_widget = QListWidget() self.list_widget.setStyleSheet(""" QListWidget { background-color: #252526; color: #cccccc; border: none; font-size: 13px; outline: none; } QListWidget::item { padding: 10px; border-radius: 4px; } QListWidget::item:selected { background-color: #094771; color: white; } QListWidget::item:hover { background-color: #2a2d2e; } """) layout.addWidget(self.search_bar) layout.addWidget(self.list_widget) main_layout = QVBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) main_layout.addWidget(self.container, alignment=Qt.AlignCenter) # 模拟命令数据 # self.commands = [ # "File: New File", # "Git: Commit All", # "Python: Run Current File", # "Settings: Open Settings", # "Terminal: Toggle Terminal", # "View: Layout Grid" # ] self.commands = [ ["1. book", "book code"], ["2. anti2", "anti2 code"], ["4. chrounim", "chro"], ["5.q-dir", "q-dir"], ] self.refresh_list("") # 信号连接 self.search_bar.textChanged.connect(self.refresh_list) self.search_bar.returnPressed.connect(self.execute_selected) self.list_widget.itemClicked.connect(self.execute_selected) # 2. 当在列表中通过方向键选中某项并按回车时,触发 itemActivated self.list_widget.itemActivated.connect(self.execute_selected) # 安装事件过滤器以捕获按键 self.installEventFilter(self) def refresh_list(self, text): self.list_widget.clear() # 简单的包含搜索(不区分大小写) # filtered = [cmd for cmd in self.commands if text.lower() in cmd.lower()] filtered = [info[0] for info in self.commands if text.lower() in info[0].lower()] self.list_widget.addItems(filtered) if self.list_widget.count() > 0: self.list_widget.setCurrentRow(0) def execute_selected(self): item = self.list_widget.currentItem() if item: print(f"触发动作: {item.text()}") text = item.text() item = [e for e in self.commands if e[0] == text][0] send_text = item[1] print("#执行命令#:{}".format(send_text)) powertoy_active_window(send_text) # self.hide() QApplication.instance().quit() def show_palette(self): width = 500 height = 400 # 假设高度为 400 self.setFixedSize(width, height) # 2. 获取屏幕中心 # availableGeometry() 会避开任务栏,确保真正的视觉垂直居中 screen_geo = QDesktopWidget().availableGeometry() screen_center = screen_geo.center() # 3. 计算面板位置,使其中心点与屏幕中心点重合 # 我们可以通过 moveCenter 方便地实现 qr = self.frameGeometry() qr.moveCenter(screen_center) self.move(qr.topLeft()) # 4. 显示并聚焦 self.show() self.raise_() self.activateWindow() self.search_bar.setFocus() self.search_bar.selectAll() # 方便用户直接覆盖键入 def eventFilter(self, obj, event): if event.type() == QEvent.KeyPress: # Esc 键退出 if event.key() == Qt.Key_Escape: self.hide() return True # 下方向键快速进入列表选择 if event.key() == Qt.Key_Down and self.search_bar.hasFocus(): self.list_widget.setFocus() return True return super().eventFilter(obj, event) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt5 VS Code Command Palette") self.resize(1000, 700) # self.minimumSize() self.showMinimized() self.setStyleSheet("background-color: #1e1e1e;") # 模拟 VS Code 背景 # 初始化命令面板 self.palette = CommandPalette(self) # self.palette.hide() self.palette.show_palette() def center_on_screen(self): # 获取窗口几何结构 frame_geometry = self.frameGeometry() # 获取屏幕中心点 # QDesktopWidget().availableGeometry() 会排除任务栏占据的空间 screen_center = QDesktopWidget().availableGeometry().center() # 将窗口几何结构的中心点移动到屏幕中心点 frame_geometry.moveCenter(screen_center) # 移动窗口左上角到计算出的位置 self.move(frame_geometry.topLeft()) def keyPressEvent(self, event): # 绑定快捷键 Ctrl+Shift+P (Qt.ControlModifier | Qt.ShiftModifier) if (event.modifiers() == (Qt.ControlModifier | Qt.ShiftModifier) and event.key() == Qt.Key_P): self.palette.show_palette() if __name__ == "__main__": app = QApplication(sys.argv) # 设置应用字体 app.setStyle("Fusion") window = MainWindow() window.show() sys.exit(app.exec_())
这个东西的主要作用是当我输入 1 时,它会找到 ["1. book", "book code"]这一项,然后 取出book code,然后激活 window 窗口切换器
,我的窗口切换器的的快捷是Win+alt+k,本来想用 ahk 来写的,但是 ahk 写 command picker 实在是不会.
这炮口果然不小哈