当前位置: 首页 > news >正文

C# 界面检测显示器移除并在可用显示器上显示

 C#  检测显示器被移除,将界面在当前可用的显示器上显示,避免程序在任务栏点击无响应。

using System;
using System.Linq;
using System.Windows.Forms;public class MonitorWatcher : IDisposable
{private readonly Form _targetForm;private Screen _currentScreen;private bool _disposed = false;public MonitorWatcher(Form form){_targetForm = form ?? throw new ArgumentNullException(nameof(form));_currentScreen = GetCurrentScreen();// 订阅显示器变化事件SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged;}private Screen GetCurrentScreen(){if (!_targetForm.IsHandleCreated || _targetForm.WindowState == FormWindowState.Minimized){return Screen.PrimaryScreen;}return Screen.FromHandle(_targetForm.Handle);}private void OnDisplaySettingsChanged(object sender, EventArgs e){// 检查当前显示器是否仍然存在var allScreens = Screen.AllScreens;bool currentScreenExists = allScreens.Any(s => s.DeviceName == _currentScreen.DeviceName);if (!currentScreenExists){// 当前显示器已移除,迁移到其他显示器MoveToAvailableScreen();}// 更新当前显示器信息_currentScreen = GetCurrentScreen();}private void MoveToAvailableScreen(){var availableScreens = Screen.AllScreens;if (availableScreens.Length == 0){return; // 没有可用显示器}// 选择最合适的显示器(优先主显示器)var targetScreen = availableScreens.FirstOrDefault(s => s.Primary) ?? availableScreens[0];// 计算新位置,确保窗口完全可见var newLocation = CalculateNewPosition(_targetForm, targetScreen);// 移动窗口_targetForm.Location = newLocation;// 如果窗口最大化,先恢复再移动再最大化if (_targetForm.WindowState == FormWindowState.Maximized){_targetForm.WindowState = FormWindowState.Normal;_targetForm.Location = newLocation;_targetForm.WindowState = FormWindowState.Maximized;}}private Point CalculateNewPosition(Form form, Screen screen){// 确保窗口完全在目标显示器的工作区域内Rectangle workingArea = screen.WorkingArea;int newX = workingArea.Left;int newY = workingArea.Top;// 如果窗口大小超过工作区,调整大小if (form.Width > workingArea.Width){form.Width = workingArea.Width;}if (form.Height > workingArea.Height){form.Height = workingArea.Height;}return new Point(newX, newY);}public void Dispose(){if (!_disposed){SystemEvents.DisplaySettingsChanged -= OnDisplaySettingsChanged;_disposed = true;}}
}

调用例子方法

using System;
using System.Windows.Forms;public partial class MainForm : Form
{private MonitorWatcher _monitorWatcher;public MainForm(){InitializeComponent();// 初始化显示器监控_monitorWatcher = new MonitorWatcher(this);// 窗体关闭时释放资源this.FormClosed += (s, e) => _monitorWatcher.Dispose();}
}

如果遇到没有定义的类,使用右键“快速操作和重构...” vs会弹出解决方法,选择弹出的解决方式。

相关文章:

  • 图像处理 | 基于matlab的多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)算法联合的低照度图像增强(附代码)
  • NGINX 四层 SSL/TLS 支持ngx_stream_ssl_module
  • Parasoft C++Test软件集成测试(部件测试)_实例讲解
  • python在容器内克隆拉取git私有仓库
  • 【ffmpeg】将多段ts视频片段合成一个mp4
  • java操作word里的表格
  • python3如何使用QT编写基础的对话框程序
  • 智能合约的浪潮:从区块链到业务自动化的 IT 新引擎
  • tcping工具使用指南
  • 中天互联在工业软件方面有哪些产品
  • QEMU源码全解析 —— 块设备虚拟化(27)
  • c/c++ 汇编码中的.cfi 指令有什么用途?
  • Python Docker 镜像构建完整指南:从基础到优化
  • Python实现web请求与访问
  • el-select+el-tree实现树形下拉选择
  • WebDebugX和多工具组合的移动端调试流程构建:一个混合App项目的实践案例
  • ref 应用于对象类型的一个案例
  • webgl(three.js 与 cesium 等实例应用)之浏览器渲染应用及内存释放的关联与应用
  • go-carbon v2.6.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
  • 在 Flutter 项目中iOS 的 App 图标和 App 名称 的设置
  • 网站建设成本分析/十种营销方法
  • 有做ppt的兼职网站吗/软文广告范例大全
  • 视频推广平台有哪些/新网站seo外包
  • 南通网站开发公司/短视频seo关键词
  • 网站虚拟主机里的内容强制删除/信息流优化师是做什么的
  • 韶关做网站的/新闻最新热点