Skip to content

[Wish] 多顯示器支援 #1

Description

@qaz10102030

想要的功能

目前好像只會出現在 1 號顯示器,有沒有機會是可以偵測多螢幕並且延伸到畫面最寬呢?

使用情境與動機

比如說 2 號顯示器接在 1 號顯示器左右兩邊的時候可以延伸
又或者是可以自由穿梭在不同螢幕底下

替代方案(選填)

No response

其他補充(選填)

Image

有請 AI 給了一下可以抓取螢幕位置的範例程式
結果可以像在設定頁面中那樣,抓到多個螢幕也可以抓到各個螢幕之間的相對位置關係

import win32api
import matplotlib.pyplot as plt
import matplotlib.patches as patches

def draw_monitor_layout():
    # 1. 取得螢幕資訊
    monitors = win32api.EnumDisplayMonitors()
    fig, ax = plt.subplots(figsize=(10, 6))
    
    all_lefts, all_tops, all_rights, all_bottoms = [], [], [], []

    print(f"繪製中... 偵測到 {len(monitors)} 個螢幕")

    for i, (hMonitor, hdc, pyRect) in enumerate(monitors):
        info = win32api.GetMonitorInfo(hMonitor)
        rect = info['Monitor']
        left, top, right, bottom = rect
        width = right - left
        height = bottom - top
        is_primary = info['Flags'] & 1

        # 2. 建立螢幕方塊 (注意:Windows 的 Y 軸向下增加,plt 通常向上增加,我們後續會翻轉 Y 軸)
        color = 'skyblue' if not is_primary else 'royalblue'
        rect_patch = patches.Rectangle(
            (left, top), width, height, 
            linewidth=2, edgecolor='black', facecolor=color, alpha=0.7
        )
        ax.add_patch(rect_patch)

        # 3. 在方塊中間標註資訊
        label = f"Monitor {i+1}\n{width}x{height}\n({left}, {top})"
        if is_primary: label += "\n(Primary)"
        
        ax.text(left + width/2, top + height/2, label, 
                ha='center', va='center', fontsize=9, fontweight='bold')

        # 收集座標以利設定坐標軸範圍
        all_lefts.append(left); all_tops.append(top)
        all_rights.append(right); all_bottoms.append(bottom)

    # 4. 設定繪圖格式
    # 翻轉 Y 軸,因為 Windows 的 Y 軸座標 (0,0) 在左上角,往下為正
    plt.gca().invert_yaxis()
    
    # 自動縮放座標軸
    plt.xlim(min(all_lefts) - 500, max(all_rights) + 500)
    plt.ylim(max(all_bottoms) + 500, min(all_tops) - 500)
    
    plt.title("Windows Multi-Monitor Layout (Relative Position)")
    plt.xlabel("Virtual Screen X (Pixels)")
    plt.ylabel("Virtual Screen Y (Pixels)")
    plt.grid(True, linestyle='--', alpha=0.5)
    plt.axhline(0, color='black', lw=1) # 標記 X 基準線
    plt.axvline(0, color='black', lw=1) # 標記 Y 基準線
    
    plt.tight_layout()
    plt.show()

if __name__ == "__main__":
    # 如果畫面模糊,可以加入這行處理高 DPI 縮放問題
    # import ctypes; ctypes.windll.shcore.SetProcessDpiAwareness(1)
    draw_monitor_layout()

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions