学习心得:一键互切「仅电脑屏幕 / 仅第二屏幕」BAT脚本
需求背景
日常外接显示器,需要一键在【仅电脑屏幕】和【仅第二屏幕】之间来回切换。不想每次按 Win+P 调出投影面板手动选择,希望双击程序直接完成切换。
尝试过读取WMI获取系统当前投影状态,但部分Windows版本WMI类不存在,会报错「无效类」。因此改用本地临时文件记录上一次操作状态的思路实现切换。
完整BAT脚本源码
@echo off
setlocal
set "STATE_FILE=%temp%\display_state.txt"
set "state=PC"
if exist "%STATE_FILE%" set /p state=<"%STATE_FILE%"
if /i "%state%"=="PC" (
>"%STATE_FILE%" echo EXT
DisplaySwitch.exe 4
) else (
>"%STATE_FILE%" echo PC
DisplaySwitch.exe 1
)
endlocal
脚本原理拆解
- 使用系统临时目录
%temp%下的文本文件display_state.txt保存标记; - 标记为
PC:代表上一次状态是【仅电脑屏幕】,本次执行切换到【仅第二屏幕】,写入标记EXT; - 标记为
EXT:代表上一次状态是【仅第二屏幕】,本次执行切换到【仅电脑屏幕】,写入标记PC; DisplaySwitch.exe是Windows原生投影切换程序:DisplaySwitch.exe 1→ 仅电脑屏幕DisplaySwitch.exe 4→ 仅第二屏幕
✅ 优点
- 不需要WMI、不需要PowerShell复杂API,兼容性极强,不会报WMI无效类错误;
- 无需管理员权限,双击直接运行;
- 不修改注册表、不改动硬件参数,安全,不会损坏显示器和电脑;
- 临时文件放在系统temp目录,系统会自动清理,无长期垃圾残留。
⚠️ 核心缺陷(重点记录)
脚本不会读取Windows真实屏幕状态,只记忆上一次点击脚本时的标记!
如果中途手动按 Win+P 去切换投影模式,脚本里保存的标记和系统真实状态就会错位,再次点击脚本时会出现“点击无效”的现象。
适用前提:屏幕切换只使用这个bat脚本,不手动Win+P干预。
使用步骤
- 新建文本文档,粘贴代码;
- 另存为:屏幕切换.bat,保存类型选【所有文件】,编码ANSI;
- 双击运行,即可一键互切;
- 进阶:右键bat创建快捷方式,在快捷方式属性设置快捷键,实现全局一键切换。我使用的是Ctrl+Alt+P快捷键。
总结
这个方案属于状态记忆型切换,牺牲了“读取系统真实状态”能力,换取极高兼容性,解决WMI查询失败的坑。适合固定只用脚本切换显示器的场景;如果会手动Win+P调整投影,这个方案就容易状态错乱,需要改用两个独立bat分开绑定快捷键。