重要的事情说三遍!
认真上课!
认真上课!
认真上课!
本程序仅供上课有需要退出教室的情况,和学习交流使用!
前面写的一个普通版的专注模式解除器
上文说的基础方法原理不再赘述,代码重新放一边:
#include <iostream>
#include <Windows.h>
#include <set>
#include <vector>
using namespace std;
struct window{
HWND WindowHwnd;
string title;
string type;
void put(string tl,string tp,HWND wh) {
WindowHwnd=wh;
title=tl;
type=tp;
}
bool operator<(const window&a) {
return title < a.title;
}
bool search(string s) {
if(s.size()==0)return true;
if(title.find(s)!=-1)return true;
return false;
}
}tmp;
vector<window>win;
set<string>ss;
string se;
BOOL CALLBACK EnumChildProc(_In_ HWND hwnd, _In_ LPARAM lParam) {
char szTitle[MAX_PATH] = {0};
char szClass[MAX_PATH] = {0};
int nMaxCount = MAX_PATH;
LPSTR lpClassName = szClass;
LPSTR lpWindowName = szTitle;
GetWindowTextA(hwnd, lpWindowName, nMaxCount);
GetClassNameA(hwnd, lpClassName, nMaxCount);
string l=lpWindowName,r=lpClassName;
if(ss.count(l))return TRUE;
ss.insert(l);
if(l.size()==0)return TRUE;
tmp.put(l,r,hwnd);
if(tmp.search(se))win.push_back(tmp);
return TRUE;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
char szTitle[MAX_PATH] = {0};
char szClass[MAX_PATH] = {0};
int nMaxCount = MAX_PATH;
LPSTR lpClassName = szClass;
LPSTR lpWindowName = szTitle;
GetWindowTextA(hwnd, lpWindowName, nMaxCount);
GetClassNameA(hwnd, lpClassName, nMaxCount);
string l=lpWindowName,r=lpClassName;
if(ss.count(l))return TRUE;
ss.insert(l);
if(l.size()==0)return TRUE;
tmp.put(l,r,hwnd);
if(tmp.search(se))win.push_back(tmp);
EnumChildWindows(hwnd, EnumChildProc, lParam);
return TRUE;
}
int x,y;
void geti(){
x=GetSystemMetrics(SM_CXSCREEN);
y=GetSystemMetrics(SM_CYSCREEN);
}
bool search(string s) {
geti();
se=s;
ss.clear();
win.clear();
EnumWindows(EnumWindowsProc, 0);
HWND h;
if(win.size()==1)h=win[0].WindowHwnd;
else return 0;
SetWindowPos(h,HWND_NOTOPMOST,0,0,x,y-50,SWP_NOSENDCHANGING);
SetWindowPos(h,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
SetWindowLong(h,GWL_STYLE,GetWindowLong(h,GWL_STYLE) | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
return 1;
}
int main() {
if(search("Classroom_")cout<<"Succeed";
else cout<<"Error.";
return 0;
}
这个破解的方法是移动窗口+取消置顶+允许用户自定义窗口大小。值得注意的是:如果不加上允许用户自定义窗口大小(也就是拖拽边界修改大小)时,也可以等比例地修改大小(底边拖拽),这是classin自己做的功能,在专注模式里能用可以说时一个BUG了,后面可能会被修复,最好把这一句代码SetWindowLong(h,GWL_STYLE,GetWindowLong(h,GWL_STYLE) | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
加上,允许自由地拖拽大小,最大化也可以通过拖拽到顶端使得屏幕变大,最小化可以在关闭classin主窗口时单击任务栏classin的图标最小化。
有时候我们拖来拖去教室窗口,不小心把它弄成最大化了,又全屏了!再调用一次程序未免太麻烦。那怎么一劳永逸地解决这个问题呢?
正题来了!
为了解决刚刚产生的问题,我们可以给那句代码
SetWindowLong(h,GWL_STYLE,GetWindowLong(h,GWL_STYLE) | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
加上一个选项:显示窗口标题栏。classin教室默认隐藏了标题栏,所以就导致最大化后自动全屏无法拖动,而有了标题栏就可以了:
变成:
SetWindowLong(h,GWL_STYLE,GetWindowLong(h,GWL_STYLE) | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_CAPTION);
即可。
我把我的功能打包了做成一个windows程序,还带有一些更厉害地功能,点击链接下载。
百度网盘下载链接
喜欢就点个赞,收个藏哦~