You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

程序无法在指定显示器启动:多屏窗体定位问题求助

问题分析与修复方案

核心问题点:

  • 类型不匹配的无效赋值:Me.FormBounds = monitor 中,monitor 是 Screen 对象,而 FormBounds 是 Rectangle 类型,这行代码无法正确设置窗体边界,属于无效操作。
  • 硬编码坐标不可靠:直接固定 x=1280,y=0 忽略了副屏的实际位置(比如主屏在右侧时,副屏的X坐标可能为负数),且未考虑系统对窗体位置的默认控制逻辑。
  • 窗体启动位置未手动指定:若窗体的 StartPosition 属性未设置为 Manual,系统会自动调整窗体位置,覆盖你在 Load 事件中设置的 Location。

修复后的代码:

Imports DAL
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.IO
Imports System.Linq

Public Class frmMain
    Public Property FormBounds As Rectangle

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            ' 优先获取非主显示器,不存在则用主显示器
            Dim targetScreen = If(Screen.AllScreens.FirstOrDefault(Function(scr) Not scr.Primary), Screen.PrimaryScreen)

            ' 强制设置窗体启动位置为手动,避免系统自动调整
            Me.StartPosition = FormStartPosition.Manual

            ' 将窗体定位到目标屏幕的左上角
            Me.Location = targetScreen.Bounds.Location
            ' 可选:设置窗体大小适配目标屏幕(按需启用)
            ' Me.Size = targetScreen.Bounds.Size

            ' 正确赋值FormBounds为目标屏幕的边界
            Me.FormBounds = targetScreen.Bounds

        Catch ex As Exception
            Me.subErrLog("frmMain_Load", ex.Message)
        End Try
    End Sub
End Class

额外验证步骤:

  1. 检查窗体设计面板的 StartPosition 属性,确认默认值是否为 WindowsDefaultLocation,如果是,即使代码中设置了位置,也会被系统覆盖,需改为 Manual。
  2. 可添加调试输出确认目标屏幕坐标:
    Debug.WriteLine($"Target Screen Position: {targetScreen.Bounds.Location}, Size: {targetScreen.Bounds.Size}")
    

内容的提问来源于stack exchange,提问作者hjh93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:42:23