由于暂时不用ClassIn,新版程序无法测试 若有人使用ClassIn并且会出现专注学习模式,请私信我
ClassIn是一个常用的在线上课软件,从3.0.2.130开始推出了“专注学习模式”,窗口会全屏且不能切换窗口。这个功能是在机构后台设置的,连老师也改不了。可有时我们有其他需要,要退出专注学习模式,这时就要使用其它的方法了。这里提供一个我自己做的小程序。
首先打开ClassIn-Mover(中国用户可以选择这里),下载一个最新的ClassIn_Mover.exe。网页上有使用说明,不过是英文的,这里我翻译一下。
ClassIn_Mover支持3.0.2.130到3.0.5.1以及3.0.7.x 4.x版本的ClassIn。在3.0.2.130之前并没有推出这一模式。在未来的版本中可能会失效。
在进入教室之前运行此程序,然后照常进入教室。
之后,该程序将自动检测教室窗口,使其无法进入全屏。
如果程序正常运行,会每秒输出一行日志,显示当前的工作状态。
该程序调用Windows的本地API,因此只能在Windows上运行。
运行程序后教室窗口仍将最大化,但可以在其上方放置其他窗口,也可以直接切换到另一个窗口。
有时,教室窗口不会正常退出全屏,请尝试退出教室重新进入。
如果您同时打开两个或多个教室程序,则该程序只会处理一个教室窗口(大多数情况是最后进入的教室)。这个问题并不大,因为很少有人需要一次登录多个帐户。
程序的源代码已经在GitHub中上传,这里不再显示。欢迎提出改进意见。
首先通过EnumWindow函数对每一个窗口的Hwnd进行处理。
窗口的标题通过GetWindowText函数获得,观察发现ClassIn的教室窗口都是以Classroom_开头的,因此通过strstr函数判断窗口标题中是否包含关键词。如果当前窗口就是ClassIn的窗口,就将FoundWindow变量改成true,将此窗口的窗口句柄记住,并停止查找。
此时回到主函数,主函数中继续进行判断。如果FoundWindow是false,就输出错误信息,并等待一秒;如果FoundWindow是true,就继续处理。
这里的处理首先通过GetWindowRect获取窗口位置,因为用到的SetWindowPos函数不仅会修改窗口优先级,还会修改窗口大小,只有先获取到窗口大小才能够下一步修改窗口优先级时不修改大小。
获取到窗口大小之后还要获取窗口状态(最大化/全屏等)。因为除了修改优先级,还要修改窗口的状态,否则无法露出任务栏进行任意操作。使用GetWindowPlacement函数获取窗口状态。之后用SetWindowPos将窗口优先级调低。之后还要进行一步判断,确保窗口不宰最大化也不再最小化时才调整为最大化,否则窗口会一直在最大化和最小化之间切换,也占用CPU。
由于程序目前的实现原理,导致其余标题中包含Classroom_的窗口会一直保持最大化状态。后续版本已解决这个Bug。