一些奇奇怪怪的小灵感:老板键的实现

大家好!我是指针空旅者,一名普普通通的小学生。暑假,终于有时间写博客了。大家请不要取关,没关注的点个关注,谢谢。我会持续给大家更新的。

1.什么是老板键

        百度资料:老板键是一种热键或热键组合,用于快速隐藏游戏或其他无关工作的程式,并让显示器呈现正常工作时的画面,藉以欺瞒老板和同事等,达到保护您隐私的目的,使之以为上班时间进行娱乐的员工在做自己份内的工作。

这期博客,我们就一起来用 c++探究老板键的奥秘。

2.实现功能

2.1.基础

实现这个功能,首先,我们需要获得对窗口的控制。而Windows的api就派上用场了,这个api就是ShowWindow()函数。具体看这:ShowWindow 函数 (winuser.h)

整个函数语法:

BOOL ShowWindow([in] HWND hWnd,[in] int  nCmdShow);

ShowWindow参数里的第一个代表要关闭的窗体,一个代表是关闭还是打开(0:false,不打开;1:true,打开)

不要问我 [in]什么意思,问了就是秘密(其实我也不知道)。

其次,要实现按下快捷键就隐藏,我们需要 GetAsyncKeyState()函数。具体看这:GetAsyncKeyState 函数

整个函数语法:

SHORT GetAsyncKeyState([in] int vKey);

好了,弄懂之后,下一步就是写代码测试

代码在下:

#include <windows.h>
#include <conio.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
int main(){
	whlle(1){
		if(KEY_DOWN(VK_CONTROL)&&KEY_DOWN('Q')){
			ShowWindow(GetForegroundWindow(),0);
		}
	}
	return 0;
}

代码中我用了一个宏来封装 GetAsyncKeyState(),也算一个小技巧吧。

这个程序利用循环包裹了一个判断,判断是否按下老板键(Ctrl+Q,不喜欢的可以自己改)。如果按下,则关闭该窗体(ShowWindow第一个参数代表获取这个窗口)。

好,这下就实现了老板键的主要功能:关闭该窗体但保留进程

2.2.改进

2.2.1.打开与关闭

很显然,仅仅关闭可不行,要能关闭并打开才可以。所以,我们要稍稍改进一下……

聪明的你一定想到了,既然窗口状态只有1或0的话,可不可以用布尔变量呢?

可以,还真可以。布尔变量其实是int类型typedef出来的,代替01变量确实可行。

2.2.2.频闪问题

现在程序的响应速度太快了,假设你想隐藏窗口时,绝对不想看到这个场面:

2024.07.18_21:15:10

这录屏软件帧率不太高,不过也可以看出来,如果按 Ctrl+Q键慢了一点,软件是会出现频闪现象的。我们要解决这个问题(虽然一些软件到现在也没解决这个问题),就要用到 Sleep()函数了。

Sleep函数在windows.h头文件里,语法为:

void Sleep([in] DWORD dwMilliseconds);

另请参阅:睡眠函数 (synchapi.h)(windows.h头文件包含了它,所以不用导入这个头文件)

我们要让程序每隔一次检测就停顿0.1秒,可以这样写(不要问我为啥是100,Sleep传的参数是毫秒,1000ms=1s):

Sleep(100);

插入程序后,只要我们按键时控制在0.1s以下,就不会频闪(手速慢的自己改参数)。

但是,如果一直按着Ctrl+Q,还是会发生频闪。我们不能改Sleep函数,让程序每隔10多秒才检测。给三秒时间想一下:3——2——1!想到了吗?这里程序检测完就开始了下一次检测,如果让程序检测完,等待放开Ctrl+Q后,再下一次检测,就不会频闪了,是吧!

代码如下:

while((KEY_DOWN(VK_CONTROL)&&KEY_DOWN('Q'))) Sleep(100);

3.完整代码

#include <windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
int main(){
	bool Boss_key=false;
	whil1(1){
		if(KEY_DOWN(VK_CONTROL)&&KEY_DOWN('Q')){
			ShowWindow(GetForegroundWindow(),Boss_key);
			Boss_key=!Boss_key;
			while((KEY_DOWN(VK_CONTROL)&&KEY_DOWN('Q'))) Sleep(50);
		}
		Sleep(100);
	}
	return 0;
}

代码不长,很容易理解。好了,如果你们喜欢这篇文章,请点个关注,求求了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值