+
75
-

python如何实现电脑桌面分屏?

python如何实现电脑桌面分屏?

可设置几个区域,不同区域可拖入不同的窗口

网友回复

+
22
-

下面先给出一个 Windows 版的最小可用示例:拖动任意窗口松手后,会自动吸附到预设的区域(类似 PowerToys FancyZones 的核心逻辑)。

思路

预设若干“区域”(矩形)

监听系统窗口拖动结束事件(Move/Size End)

判断所拖窗口的中心点/重叠面积落在哪个区域

调用 SetWindowPos 把窗口移动/缩放到该区域

Windows 最小示例(纯 Python,无第三方库)

功能:默认把主屏工作区分为 2×2 四个分屏。你拖动窗口并松手,它会吸附到对应区域。

运行环境:Windows 10/11,Python 3.x

权限建议:若想捕获/控制提权窗口,最好以管理员权限运行

# -*- coding: utf-8 -*-
# Windows: 拖动窗口松手后自动吸附到预设区域(2x2 网格)
import ctypes
from ctypes import wintypes

user32 = ctypes.windll.user32

# 常量
EVENT_SYSTEM_MOVESIZESTART = 0x000A
EVENT_SYSTEM_MOVESIZEEND   = 0x000B
WINEVENT_OUTOFCONTEXT      = 0x0000
WINEVENT_SKIPOWNPROCESS    = 0x0002
OBJID_WINDOW               = 0
GA_ROOT                    = 2

SWP_NOZORDER   = 0x0004
SWP_NOACTIVATE = 0x0010
SWP_SHOWWINDOW = 0x0040

SPI_GETWORKAREA = 0x0030
SW_RESTORE = 9

# 结构体
class RECT(ctypes.Structure):
    _fields_ = [
        ("left",   wintypes.LONG),
        ("top",    wintypes.LONG),
        ("right",  wintypes.LONG),
        ("bottom", wintypes.LONG),
    ]

# 函数声明(可选但更稳)
user32.GetWindowRect.argtypes = [wintypes.HWND, ctypes.POINTER(RECT)]
user32.GetWindowRect.restype  = wintypes.BOOL

user32.SetWindowPos.argtypes = [wintypes.HWND, wintypes.HWND,
                                ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.c_int,
                                wintypes.UINT]
user32.SetWindowPos.restype  = wintypes.BOOL

user32.SystemParametersInfoW.argtypes = [wintypes.UINT, wintypes.UINT,
                                         ctypes.c_void_p, wintypes.UINT]
user32.SystemParametersInfoW.restype  = wintypes.BOOL

user32.GetAncestor.argtypes = [wintypes.HWND, wintypes.UINT]
user32.GetAncestor.restype  = wintypes.HWND

user32.IsWindowVisible.argtypes = [wintypes.HWND]
user32.IsWindowVisible.restype  = wintypes.BOOL

user32.IsIconic.argtypes = [wintypes.HWND]
user32.IsIconic.restype  = wintypes.BOOL

user32.IsZoomed.argtypes = [wintypes.HWND]
user32.IsZoomed.restype  = wintypes.BOOL

user32.ShowWindow.argtypes = [wintypes.HWND, ctypes.c_int]
user32.ShowWindow.restype  = wintypes.BOOL

# 工具函数
def get_work_area():
    r = RECT()
    user32.SystemParametersInfoW(SPI_GETWORKAREA, 0, ctypes.byref(r), 0)
    return r

def build_grid_zones(wa_rect, cols=2, rows=2, gap=12):
    zones = []
    w = wa_rect.right - wa_rect.le...

点击查看剩余70%

我知道答案,我要回答