设置程序显示屏幕位置

news/2025/3/9 10:21:14/文章来源:https://www.cnblogs.com/sundh1981/p/18757072

在多屏显示系统中经常需要设置程序界面显示的屏幕位置,之前也曾写过控制屏幕位置的功能,偶然再一次使用中发现功能失效了,查了一下原因,这里对解决方案做一个简单的记录,以备备忘。

1.问题 “窗口启动位置 (WindowStartupLocation) 冲突”

首先说第一条:由于在设计程序时,一般会在主界面程序做默认设置窗体显示位置为屏幕中心位置,即 设置窗口的 WindowStartupLocation 设置为 CenterScreen 或 CenterOwner,后续手动设置 Left 和 Top 会被覆盖,导致设置失效。

  • 解决方法
    在构造函数中设置 WindowStartupLocation
    public MainWindow()
    {InitializeComponent();this.WindowStartupLocation = WindowStartupLocation.Manual; // 必须先设置Loaded += MainWindow_Loaded;
    }
    

2. 窗口状态 (WindowState) 冲突 (WindowStartupLocation) 冲突”

同上面类似,如果窗口处于最大化状态 (WindowState = Maximized),手动设置 Left 和 Top 无效

  • 解决方法
    在构造函数中设置 WindowsState,强制将窗口状态设为 Normal
    public MainWindow()
    {InitializeComponent();this.WindowStartupLocation = WindowStartupLocation.Manual; // 必须先设置this.WindowState=WindowState.Normal;//必须设置Loaded += MainWindow_Loaded;
    }
    

3. DPI 缩放问题”

问题:不同屏幕的 DPI 缩放比例不同,导致坐标计算错误。

  • 解决方案:
    将 System.Windows.Forms 获取的物理像素坐标转换为 WPF 的逻辑坐标。
    在窗体显示位置设置方法中增加坐标转换
      private void setAppPostion()
    {// 获取所有屏幕Screen[] screens = Screen.AllScreens;// 假设要显示在第二个屏幕(索引从0开始)int targetScreenIndex = Int32.Parse(ConfigurationManager.AppSettings["screenIndex"]);if (targetScreenIndex < screens.Length){// 必须设置为Manual,手动指定位置this.WindowStartupLocation = WindowStartupLocation.Manual;Screen targetScreen = screens[targetScreenIndex];//获取当前窗口缩放比例var source = PresentationSource.FromVisual(this);if (source != null){Matrix transform = source.CompositionTarget.TransformFromDevice;double dipX = transform.M11;//水平缩放比例double dipY = transform.M22;//垂直缩放比例//将物理像素转换为逻辑单位this.Left = targetScreen.WorkingArea.Left / dipX;this.Top = targetScreen.WorkingArea.Top / dipY;//设置窗口大小为目标屏幕的工作区域尺寸this.Width = targetScreen.WorkingArea.Width;this.Height = targetScreen.WorkingArea.Height;}}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/894969.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 磁盘扩容lvm(虚拟机环境)

fdisk -l 查看磁盘情况对新增加的硬盘进行分区,使用fdisk命令创建和维护分区表。 fdisk /dev/vda 输入p:查看已分区数量(有两个 /dev/vda1 /dev/vda2) 输入n(new partition):新增加一个分区 输入p(parimary partition):分区类型选择为主分区 输入分区号3(partition …

Vue 自定义指令封装实现防抖 防止按钮暴力点击

本来项目前期没有做按钮防抖功能 快结束时才想起来 然后一个个写太慢了 然后就想着封装一下 vue3:新建directive.jsexport default {//自定义节流操作preventReClick: {mounted(el, binding) {el.addEventListener(click, () => {if (!el.disabled) {el.disabled = truesetT…

3.6 CW 模拟赛 T3. 列表

思路题意 有一个长度为 2n+12 \times n + 12n+1 的整数列表 aaa 初始恰好为 1∼2n+11 \sim 2 \times n + 11∼2n+1 的排列; 有一个集合 S\mathbb{S}S 初始为空, 进行 n+1n + 1n+1 次操作, 第 iii 次操作如下:111. 选择列表最中间位置的数第 n+2−in + 2 - in+2−i 个数, 从列表…

Navicat 操作 MySql 修改表结构时保存后直接卡死无反应问题

一、问题如下:在Navicat中调整表结构,添加新的字段。之后保存的时候就一直显示正在保存,等了一会儿也一直没有反应,点关闭也停止不了保存操作,就一直卡着。二、问题解决1、查看当前的进程列表: show processlist会发现有等待的进程:这些进程状态为Waiting for table met…

SAP 3M胶带:行业解决方案的革新者

SAP 3M胶带:行业解决方案的革新者 在胶带加工行业,SAP 3M胶带凭借其卓越的性能和广泛的应用领域,成为了众多企业的首选。而SAP与3M的结合,更是将科技与创新完美融合,为行业带来了全新的解决方案。库存管理痛点解决 胶带加工行业的多变性使得库存管理成为了一大痛点。然而,…

OPC DA获取DCS数据(配置DCOM)

OPC DA配置操作手册配置完成后,访问远程ip,就能获取到服务 C#使用Interop.OPCAutomation采集OPC DA数据,支持订阅(数据变化)、单个读取、单个写入、断线重连 qq:505645074

Hyper-V虚拟机黑屏还可能与虚拟机的显示配置有关,需要检查哪些?

Hyper-V虚拟机黑屏确实可能与虚拟机的显示配置有关。在处理这类问题时,需要检查以下几个方面:一、图形处理器设置 检查虚拟化模式: 进入虚拟机的设置,找到“显示”或“图形处理器”选项。 确认是否选择了正确的图形处理器虚拟化模式。例如,有时选择集成显卡模式可能导致黑…

PROFINET转PROFIBUS揭秘网关模块如何实现西门子PLC与仪表协议转换通讯

一、项目背景在当今竞争激烈的工业生产领域,设备间的高效通讯已成为提升生产效率、确保产品质量的核心要素。以一家颇具规模的制造企业为例,其生产线的控制系统以西门子1516PLC为核心,凭借其强大的运算与控制能力,精准调控生产流程的各个环节。与此同时,用于实时监测生产过…

Easyexcel(4-模板文件)

EasyExcel 提供模板导出功能,通过预设模板和占位符,结合 Java 数据模型,开发者可快速生成格式化的 Excel 报表,操作简便,性能高效,适合大数据量导出场景文件导出 获取 resources 目录下的文件,使用 withTemplate 获取文件流导出文件模板 @GetMapping("/download1&q…

AI 辅助教学案例 02

收集整理并记录现有的比较火爆的国产 AI 在教育教学中的使用案例,以期和各位同仁、莘莘学子共同进步。前情概要 2025开年之初,人工智能呈现井喷式发展,非常火爆,尤其是 DeepSeek 的发展一骑绝尘,为适应形式所需,将使用过的案例做个记录,便有后续备查。若想小试牛刀,请点…

线性回归--最小二乘法+梯度下降算法+sklearn库

线性回归一元: (1)手工最小二乘法import numpy as np a=np.loadtxt("homespace_price",delimiter=,,dtype=float) homespace=a[:,0] price=a[:,1] x_avg=np.average(homespace) y_avg=np.average(price) xfang_avg=np.average(homespace*homespace) xy_avg=np.ave…

震惊!AI编程正在淘汰这5类人,你在其中吗?

大家好,我是狂师。 今天在知乎上看到一个关于讨论:“人工智能大爆发,AI编程工具对程序员到底是颠覆还是辅助?’”问题,觉得蛮有意思。的确,AI编程的出现,引发了人们对于程序员职业未来的广泛讨论,有人担忧它可能会颠覆程序员的职业, 今天分享一些个人观点。先说结论:…