Windows 窗体的自适应分辨率、分屏显示、开机自启动
前言
这里所说的针对Winform、WPF 都适用。开机自启动对于控制台的也可以。
还是从项目实践中得来的,在这里记录下来。
对于自适应、分屏显示,在以前感觉应该比较高大上的问题,会比较难。在经过这次的实践感觉挺简单的。不过其中还是有一点要根据实际的业务有一些复杂。
一、自适应分辨率
在屏幕的分辨率改变的时候,改变窗口的大小为当前的分辨率,进行适应。这里是要在 “Window_SizeChanged” 事件里面处理。
具体代码:
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
this.WindowState = WindowState.Normal;
this.WindowStyle = WindowStyle.None;
this.ResizeMode = ResizeMode.NoResize;
if (screenIndex == )
{
this.Left = ;
this.Top = ;
Width = Screen.AllScreens[].Bounds.Width;
Height = Screen.AllScreens[].Bounds.Height;
}
else
{
int leftPix = ;
for (int i = screenIndex - ; i >= ; i--)
{
leftPix += Screen.AllScreens[i].Bounds.Width;
}
this.Left = leftPix;
this.Top = ;
Width = Screen.AllScreens[screenIndex].Bounds.Width;
Height = Screen.AllScreens[screenIndex].Bounds.Height;
}
}
这个代码里面有分屏显示的一部分。
二、分屏显示
项目中需要一台主机输出到多个屏幕,在对应屏幕显示窗口。
在这里要注意,屏幕的排列顺序。这个顺序是“显示”设置界面设置的顺序,不是物理的顺序。
例如:对于两个屏幕,物理上可以一个在上一个在下,但是在“显示”设置界面,可以设置为左右的。
对于左右顺序:每一个屏幕的宽、高还是屏幕的宽高,只是其起始位置坐标不一样。第一个左上角:(0,0),第二个左上角(width1,0)【这里的 width1 是平屏幕1的宽】,后面以此类推。
对于上下顺序:每一个屏幕的宽、高还是屏幕的宽高,只是其起始位置坐标不一样。第一个左上角:(0,0),第二个左上角(0,height1)【这里的 height1是平屏幕1的高】,后面以此类推。
下面的是一个示例图:

知道了屏幕对应坐标的变化就可以上代码:
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
this.WindowState = WindowState.Normal;
this.WindowStyle = WindowStyle.None;
this.ResizeMode = ResizeMode.NoResize;
string appName = "Client";
int appCount = Process.GetProcessesByName(appName).ToList().Count;
int screenCount = Screen.AllScreens.Count();
if (appCount > screenCount)
{
this.Close();
}
else if (appCount == )
{
this.Left = ;
this.Top = ;
Width = Screen.AllScreens[].Bounds.Width;
Height = Screen.AllScreens[].Bounds.Height;
}
else
{
int leftPix = ;
for (int i = appCount - ; i >= ; i--)
{
leftPix += Screen.AllScreens[i].Bounds.Width;
}
this.Left = leftPix;
this.Top = ;
Width = Screen.AllScreens[appCount - ].Bounds.Width;
Height = Screen.AllScreens[appCount - ].Bounds.Height;
}
this.screenIndex = appCount - ; InitPlay();
}
上面的代码就是根据当前程序的个数,来分配屏幕。开了多个程序,感觉这样方式还不够好,应该一个程序进行分配。
三、开机自启动
开机自启动有几个方式:
1、在开机启动文件夹里面加入要开机启动的快捷方式即可;
2、修改注册表,添加要启动的程序到注册表;
这里用的是第二种方法。
public static void AutoStart(bool isAuto)
{
try
{
if (isAuto == true)
{
RegistryKey R_local = Registry.LocalMachine; //RegistryKey R_local = Registry.CurrentUser;
RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
R_run.SetValue("应用名称", "程序地址/Client.exe");
R_run.Close();
R_local.Close();
}
else
{
RegistryKey R_local = Registry.LocalMachine;//RegistryKey R_local = Registry.CurrentUser;
RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
R_run.DeleteValue("应用名称", false);
R_run.Close();
R_local.Close();
} //GlobalVariant.Instance.UserConfig.AutoStart = isAuto;
}
catch (Exception)
{
System.Windows.MessageBox.Show("您需要管理员权限修改", "提示");
}
}
Windows 窗体的自适应分辨率、分屏显示、开机自启动的更多相关文章
- c# Winform 开发分屏显示应用程序
分屏显示即可把一台主机内运行的多个程序分别显示在不同的两个(或多个)屏幕上.目前市面上主流的显卡都支持分屏显示(显示双屏幕),如果需要显示2个以上的屏幕,则应使用“拖机卡”类的硬件. 设置分屏显示的两 ...
- vim 分屏显示
我用vim打开一个文件后,想同时打开另一个文件,就像windows中打开两个记事本一样,因此需要分屏显示 首先用vim打开一个文件 vim file1 输入命令[Esc] :sp file2 分屏打开 ...
- cat 显示文本、less 分屏显示文本、more 分页显示文件、head 显示文件的前面的内容、cut 切割、paste合并、wc用来对文本进行统计、sort排序、权限、关闭文件、vim的使用
cat 显示文本 -E 显示结尾的$符 -n 对显示的每一行进行编号 -b 对非空行进行编号 -s 对连续的空行进行压缩 tac 倒序显示 less 分屏显示文本 向下翻一屏 空格 向下翻一行 回车 ...
- 转: Eclipse 分屏显示同一个文件
Eclipse 分屏显示同一个文件 场景 : 某个类很大,可能有数千行.当你想要将类开头部分与中间或者靠后的部分进行对比时,请follow如下步骤: Window -> Editor -&g ...
- wpf 制作播放视频的屏保程序、而且能分屏显示
这个程序用到了WPF里 “visual_Brush”(主要是为了实现分屏显示) , “UserControl” ,这两个知识点: 在屏保状态下播放指定文件夹下的视频,而且能分屏显示: 把编译好的屏保 ...
- c# 远程监控(4) 接收端 RTP包重组 分屏显示
我们在上一期使用RTP协议,并进行了配置,打包了视频数据,这一期我们就对发送的数据进行重组,并显示在接受端上.最后对其进行扩展,支持多客户端视频发送,并在接收端分屏显示.完成远程监控的模拟. 先来个效 ...
- (转载)mysql分屏显示结果
(转载)http://blog.csdn.net/wylkeke/article/details/7280645 linux机器: 在mysql命令行输入pager more就可以分屏显示结果了,取消 ...
- Eclipse 分屏显示同一个代码文件
描述: 今天在使用Eclipse开发的时候不知按错哪个键,出现编辑框分屏显示同一个代码,由于之前没有使用过这一功能,所以就去查了一下,原来是Eclipse的分屏功能. 快捷键: 方式一:Window ...
- linux下信息分屏显示
在字符界面下,经常遇到ls之后信息太长,只能看到最后一页的信息,这时就需要分屏显示了. 常用: ls | less 这样就可以分屏显示了,并可以用PgUp和PgDn来上下翻页. 也可以用: ls | ...
随机推荐
- 【VS开发】【C/C++开发】memcpy和memmove的区别
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void ...
- 安装 gearman
准备:php 对应gearman插件包 https://pecl.php.net/package/gearman 1. 先安装依赖库 [root@VM_27_0_centos /]# yum inst ...
- oracle创建用户并指定表空间
/*第1步:创建ODPS数据表空间 */create tablespace ODPS logging datafile '/home/oracle/tablespace_dir/ODPS.dbf' s ...
- javascript高德地图实现点击marker消失marker
javascript高德地图实现点击marker消失marker <pre> var markers = []; var positions = [[120.17718, 30.21772 ...
- 在ensp上的进行的浮动路由
原理 实验模拟内容 搭建实验拓扑 相关参数 其他设置端口ip都一样,serial也一样(三个路由器都要设置的) 简单测试一下连通性 下面我们分别在路由器上配置所在网段的静态路由 配置完之后我们来查看一 ...
- 轮胎魔术公式(Magic Fomula)模型
魔术公式是用三角函数的组合公式拟合轮胎试验数据,用一套形式相同的公式就可以完整地表达轮胎的纵向力Fx.侧向力Fy.回正力矩Mz.翻转力矩Mx.阻力矩My以及纵向力.侧向力的联合作用工况,故称为“魔术公 ...
- 12 Spring JdbcTemplate的使用
1.项目搭建 <1>数据库表account对应的账户实体类 package domain; import java.io.Serializable; /** * 账户实体类 */ publ ...
- 什么是openshift
Openshift是一个开源的容器云平台,底层基于当前容器的事实标准编排系统Kubernetes和docker引擎,企业可以基于此平台搭建内部Paas平台,贯穿CI/CD流程,提高企业IT效率,拥抱D ...
- tkinter学习笔记_05
10.菜单 menuber import tkinter as tk root = tk.Tk() root.title("xxx") root.geometry('200x100 ...
- 广度优先搜索(BFS)思路及算法分析
1.算法用途: 是一种图像搜索演算法.用于遍历图中的节点,有些类似于树的深度优先遍历.这里唯一的问题是,与树不同,图形可能包含循环,因此我们可能会再次来到同一节点. 2.主要思想: 主要借助一个队列. ...