因为用投影仪当显示器,有时候将窗口在不同屏幕间移动很麻烦。
当然移动窗口的方法有很多。
一个是用鼠标拖动。但是如果显示器不开,根本看不见屏幕。我也挺奇怪的,明明显示器关了,windows还是认为它开着。
另一个是用键盘快捷键Win+Shift+箭头,缺点是必须要键盘在手边。可我这条躺在床上的咸鱼手边只有一个鼠标。
想到python学了这么多年,不就是为了能偷懒,于是一边问AI,一边调代码,算是有了一个结果。
Python代码
代码还是很简单的,90%都是直接拷贝,10%需要自己组织一下,主要功能就是将窗口移动到鼠标所在的屏幕。
from screeninfo import get_monitors, Monitor
from pygetwindow import getAllWindows, Win32Window
import win32api
import win32gui
import win32con
import time
def restore_window(w: Win32Window):
# 获取窗口的状态
hwnd = w._hWnd
placement = win32gui.GetWindowPlacement(hwnd)
if placement[1] == win32con.SW_SHOWMAXIMIZED:
# 如果窗口是最大化的,恢复到正常状态
win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
elif placement[1] == win32con.SW_SHOWMINIMIZED:
# 如果窗口是最小化的,恢复到正常状态
win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
win32gui.SetForegroundWindow(hwnd) # 将窗口带到前台
# else:
# print("Window is already in a normal state.")
def get_visible_windows():
monitors = get_monitors()
mx_width = max(m.width for m in monitors)
mx_height = max(m.height for m in monitors)
windows: list[Win32Window] = []
for w in getAllWindows():
title = w.title.strip()
if not title:
continue
if (w.isMaximized or w.isMinimized) or (
w.height = monitor.x:
return monitor
def has_monitor_contains_window(monitor: Monitor, window: Win32Window):
if window.isMaximized or window.isMinimized:
return False
left = monitor.x
top = monitor.y
width = monitor.width
height = monitor.height
return window.left >= left and window.right
注册右键菜单
这个小工具最麻烦的部分,就是将菜单添加到桌面右键菜单。之所以麻烦,是因为操作注册表涉及到管理员权限。
好在AI给力,还是照着抄就行。具体代码就不贴了。
安装菜单时,会一起把python脚本的依赖给pip了。
删除右键菜单
做完添加功能,想着有始有终,也得来个删除功能。结果又忙了好久。
一开始,还是选择用python脚本,结果死活得不到操作权限。
然后选择bat,遇到无法提权问题。改成vbs,权限有了,但是命令窗口一闪而逝,然后啥也没发生。
最后实在没办法,妥协了,只能让用户手动用管理员权限运行脚本了。
安装办法
克隆项目,然后运行“添加菜单.bat”
git clone https://gitee.com/senbinge/window_manager.git
不出意外的化,在桌面背景上右键,会看到菜单

Snipaste_2024-12-28_19-52-55.jpg (27.48 KB, 下载次数: 0)
下载附件
2024-12-28 19:55 上传
问题
本来计划是窗口移动前后保持大小一致,但是要针对屏幕分辨率不同做缩放。一时找不到获得屏幕工作区域大小的方法,于是作罢,反正能用就行呗。