windows C++破解专注模式【加强版】(和对之前的博文的补充描述)

重要的事情说三遍!

认真上课!
认真上课!
认真上课!

本程序仅供上课有需要退出教室的情况,和学习交流使用!

前面写的一个普通版的专注模式解除器
上文说的基础方法原理不再赘述,代码重新放一边:

#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程序,还带有一些更厉害地功能,点击链接下载。
百度网盘下载链接
喜欢就点个赞,收个藏哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值