最近在GitHub上改进一开源工具 Sedentary-reminder 时遇到的一个问题,如何在多个屏幕上同时创建Form以实现该工具的功能。
Sedentary-reminder功能介绍
该工具是由WeiJunbo开发的基于WinForm的提醒久坐小工具,具体内容可以看代码库。
在使用了一段时间后我发现,在用户规定的时间耗尽后,程序锁屏仅限于主屏幕,这对于使用多个屏幕进行开发的我来说实在是鸡肋,经常会出现主屏幕对我的鼠标和键盘进行了锁定,但副屏幕依旧在修改论文的情况。
因此我的需求很明确了,如何将锁定屏幕的窗体应用到每块屏幕?
多屏幕创建多Form
程序的工作机制是当用户设定的时间耗尽时,程序会关闭WorkForm,开启RestForm,同时锁定键盘和鼠标,当设定的休息时间到时,关闭RestForm,开启WorkForm,因此修改变为:当用户设定的时间耗尽时,程序关闭WorkForm,在每个界面开启RestForm,当设定的休息时间到时,关闭RestForm,并在主屏幕创建WorkForm。
识别和操作屏幕
对多屏的操作,网络上有一些资料,这篇博文写的比较详细c# Winform 开发分屏显示应用程序。
首先识别屏幕信息依赖Screen类,Screen的Primary参数可以判断是否是主屏幕,Screen.Bound存储了各屏幕的边界信息。
因此将逻辑修改为,根据Screen.AllScreens.Count()识别屏幕数量,创建相应数量的窗体,对每个窗体最重要的是要进行如下设置:
this.StartPosition = FormStartPosition.Manual;
this.Location = Screen.Bound.Location;
第一行代码决定了窗口的开始位置将由其Location决定,然后又将其Location指定为当前屏幕的Location。
当RestForm关闭时,不需要为每个RestForm创建WorkForm,因此识别出主屏幕,当主屏幕对应的Form关闭时创建WorkForm,其他Form直接关闭即可解决上述问题。
对上述工具的修改可以参见我的代码库。