Windows图形界面
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows图形界面相关的知识,希望对你有一定的参考价值。
参考技术A 窗口就是屏幕上的一块区域,在这块区域中,应用程序取得用户的输入,显示程序的输出。每个GUI应用程序至少要创建一个窗口,称为主窗口,它作为用户与应用程序间的主界面来提供服务。大多数应用程序也直接或者间接地创建其他窗口,来完成与主窗口相关的工作。每个窗口都在显示输出和从用户取得输入方面起着一定的作用。窗口客户区是应用程序显示输出的部分。应用程序必须提供一个称为窗口函数的回调函数来处理窗口的输入,向客户区显示输出。
GUI应用程序的入口地址是WinMain,这是一个自定义的回调函数。
Windows的消息驱动:
创建窗口之后,就要对窗口的行为负责。是操作系统告诉程序用户在窗口上的动作的。Windows不断向应用程序发送消息,通知发生了什么事情。比如用户改变了窗口大小,Windows就向这个程序发送一个消息,指明窗口新的大小。
当Windows向程序发送消息时,它调用程序中的一个函数,这个函数的参数精确地描述了Windows发送的消息。在程序中这个函数为窗口函数(Window Procedure)或消息处理函数。它是一个自定义的回调函数。SendMessage函数用于向窗口发送消息,直到目标窗口函数处理完这个消息才返回。
系统向应用程序发送消息的过程:
系统为应用程序传递所有的输入到它的各个窗口,每个窗口都关联一个窗口函数,每当这个窗口有输入时,系统调用该函数。窗口函数处理输入,然后再将控制权交给系统。
无限的消息循环:
在调用UpdateWindow函数之后,整个窗口已经显示在桌面上,程序必须准备从用户接收键盘和鼠标输入了。Windows为每个线程维护了一个消息队列,每当有一个输入发生,Windows就把用户的输入翻译成消息放在消息队列中。利用GetMessage函数可以从调用线程的消息队列中取出一个消息来填充MSG结构。如果消息队列中没有消息(即没有用户输入),这个函数会一直等待下去,直到有消息进入到消息队列为止。GetMessage函数从消息队列中取得的消息如果不是WM_QUIT,则返回非零值。一个WM_QUIT消息会促使GetMessage函数返回0,从而结束消息循环。
DispatchMessage函数分发一个消息到对应窗口的窗口函数,当它返回时,消息循环从调用GetMessage函数开始进入下一轮循环。
通常Windows程序设计者用一个switch和case结构来决定消息处理函数收到了什么消息,以及如何处理这个消息。所有消息处理函数不处理的消息都必须传给一个名为DefWindowProc的函数让Windows做默认处理,从DefWindowProc函数返回的值也必须从消息处理函数返回。否则Windows就失去了与应用程序通信的途径,也就不能再控制窗口的行为了。
WM_PAINT消息通知应用程序窗口客户区有一块或者全部变成无效,必须刷新。这意味着窗口客户区的内容必须被重画。对BeginPaint函数的调用将使整个客户区有效,然后返回设备环境句柄,在窗口的客户区显示图形和文字时需要使用这个设备环境句柄。EndPaint函数负责释放设备环境句柄,使它变得不再能用。
Windows 图形化界面子系统安装教程
Windows 图形化界面子系统安装教程
一、概述
为什么需要Windows子系统?
WSL(Windows Subsystem For Linux)是Windows自身提供的对Linux系统的支持套件。
相较于双系统,WSL省去了来回切换系统的工作;相较于VM,WSL提供了更高的性能。
安装WSL的必要条件?
几乎大部分的Win10系统都能安装WSL,但都是没有GUI的那种。
本文探讨的也是这种情况下如何为命令行添加图形渲染能力。
在Win10 Insider Preview内部版本21362+以后提供官方渲染工具WSLg,无需本文中繁琐步骤能一步到位,有条件的朋友可以通过更新系统直接体验。
Microsoft官方同时也宣布Win11内部版本22000或更高版本也支持Linux GUI应用的安装,感兴趣的朋友可以自行参考官方文档。
二、安装步骤
注: 本安装步骤以Ubuntu18.04为例,其它系统同理
2.1 安装子系统
-
打开开发者模式(非管理员账号登录的同学请移步到文末,有解决方案)
-
在
打开或关闭Windows功能
中添加Hyper-V支持和WSL支持
-
重启电脑应用更新
-
打开Windows应用商店,搜索并安装Ubuntu(以ubuntu18.04为例)
-
设置默认管理员角色
至此我们已经可以在开始菜单中找到安装好的Ubuntu
先不着急启动,我们配置一下管理员角色,可以省去我们以后每条指令都要加“sudo”的烦恼
打开Ubuntu安装目录(我是
C:\\Users\\user\\AppData\\Local\\Microsoft\\WindowsApps\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc
)执行以下指令即可ubuntu1804.exe config --default-user root
2.2 安装图形化界面
-
切换WSL版本
-
下载并安装WSL2内核更新包
-
管理员身份运行PowerShell执行以下指令升级WSL
# 查看当前版本 如果VERSION是1才切换 wsl -l -v # 关闭wsl wsl --shutdown # 重启vm service Get-Service vmcompute | Restart-Service # 切换版本,切换版本会中断子系统 wsl --set-default-version 2 / wsl --set-version Ubuntu-18.04 2 # 等待数分钟后查看切换后的结果 wsl -l -v
-
-
安装MobaXterm,Moba为子系统提供了图形化渲染接口
-
安装好后设置Moba X11,主要是设置权限控制方式和剪贴板
-
重启电脑
-
重启电脑后打开Moba,通过Moba连接Ubuntu命令行界面(如果此步出现问题可以移步至文末查找解决方案)
-
连接后在Ubuntu下执行指令,配置图形化界面ip和端口
vim ~/.bashrc # 编辑模式里加入以下脚本,该脚本自动找路由第二跳,也就是WSL虚拟网卡IP,在Windows下用ipconfig可以看到WSL网卡地址 export DISPLAY=`ip route | grep default | awk 'print $3'`:0 # 使脚本立即生效 source ~/.bashrc
-
然后我们就可以下载IDEA在命令行执行以下命令启动idea
# 先cd到你Ubuntu IDEA安装bin目录下 sh idea.sh
-
Moba会自动帮我们渲染出IDEA的图形化界面,剩下步骤和我们在Windows上使用一样
2.3 后续
-
非管理员账号登录打开开发者模式
注: 这一步是针对非管理员账号登录,但是能申请到管理员权限(比如公司、网吧非PC的权限管理方式),如果拿不到管理员权限就没必要继续下去了
非管理员账号无法直接通过设置打开开发者模式,但是可以通过修改注册表的方式实现同样的效果。
非管理员账号进入开发者选项大概率会看到以下的界面:
Follow以下步骤即可完成开启工作:
-
使用管理员身份运行CMD
-
CMD中输入以下内容回车
regedit
-
打开注册表编辑器后找到键值
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppModelUnlock
-
右键新建
DWORD值
名为AllowDevelopmentWithoutDevLicens
,双击输入值为1(进制无所谓) -
再增加一项
AllowAllTrustedApps
也是Dword 值为1
-
这样就打开了开发者模式(注意图形界面显示可能是没有打开,但是实际打开了)
-
不放心可以重启下电脑
-
-
Moba连不上Ubuntu
常发生于重启电脑第一次连接时,重启下服务就好了,PowerShell管理员权限执行以下指令:
restart-service vmms
-
Windows下Ubuntu挂载位置
我的电脑里是以下路径
C:\\Users\\user\\AppData\\Local\\Packages\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\\LocalState\\rootfs\\home\\ling
-
Ubuntu连不上网
如果Windows网络好用的情况下,Ubuntu连不上很可能是Name Server的问题
在Ubuntu下执行以下指令
sudo rm /etc/resolv.confsudo bash -c 'echo "nameserver 10.237.161.149" > /etc/resolv.conf'sudo bash -c 'echo "[network]" > /etc/wsl.conf'sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'sudo chattr +i /etc/resolv.conf
以上是关于Windows图形界面的主要内容,如果未能解决你的问题,请参考以下文章