screen.frompoint(cursor.position)可直接获取鼠标所在屏幕的screen对象,再用array.indexof(screen.allscreens, screen)得索引;cursor.position返回的是dpi感知后的屏幕坐标,无需额外转换。

直接调用 配合 是最稳妥的方式,它不依赖窗口句柄,也不要求当前线程有消息循环,适合后台线程或服务场景。
常见错误是传入未转换的客户端坐标(比如窗体内的 ),结果返回错误屏幕—— 要的是屏幕坐标,不是窗体坐标。
- 返回当前鼠标所在的 对象
- 用 获取索引(注意:索引不保证与物理排列一致,仅反映 数组顺序)
- 如果只需要索引,别先取 再比对,效率低还容易因 DPI 缩放出错
是系统标记的主显示器,和鼠标位置完全无关。多显示器环境下,用户可能把鼠标移到副屏,但 始终不变。
典型误用场景:做截图工具时,误用 当作当前操作区域,结果鼠标在右屏时仍截左屏。
- 主屏设置可被用户随时修改(右键桌面 → 显示设置 → 设为主显示器)
- 的 和 中某项的 可能相同,但这是巧合,不是判定依据
- 真要区分主副,应结合 属性,而非硬编码索引 0
不需要转换。 返回的就是 DPI 感知后的屏幕坐标(即“逻辑像素”,Windows 已做缩放映射), 内部也按同样逻辑处理,二者天然对齐。
容易踩的坑是手动调用 或 去“矫正”坐标,反而导致跨屏判断失败——尤其当各显示器缩放比例不同时(如主屏125%,副屏100%)。
- WinForms 应用默认启用 DPI 感知(.NET 4.7+ / app.manifest 中设 )
- 若禁用 DPI 感知, 会返回未缩放坐标,此时 仍可用,但所有屏幕坐标系都失真,建议直接启用感知
- 验证方法:拖动鼠标到不同缩放屏的边界,观察 返回的 是否实时切换
拿到索引只是起点,后续操作必须基于对应 的 或 ,不能假设所有屏幕尺寸或缩放一致。
例如弹窗居中到当前鼠标屏,若直接用 就会错位——实际屏宽可能是 2560×1440,且缩放后逻辑宽度只有 2048。
- 创建窗体前,先取 (含任务栏)或 (不含任务栏)
- 截图用 时,源坐标应为 ,不是
- 避免用 索引缓存,因为数组顺序可能随显示器热插拔改变;每次需要时重新查 更可靠
靠 + 这一对组合就能稳住多数场景,真正麻烦的是后续操作里混用不同坐标系,或者把“索引”当成物理位置硬编码。多显示器的不确定性不在获取,而在使用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/241801.html