这段代码可以将你鼠标焦点经过的所有窗口都变成半透明窗口
#include <windows.h>
#include <winuser.h>
#include <algorithm>
#include <iostream>
using namespace std;
char last[0xFF];
int main()
{
for(;;)
{
Sleep(20);
char title[0xFF];
HWND hwnd = GetForegroundWindow();
GetWindowTextA(hwnd, title, sizeof(title));
if(strcmp(last, title))
{
strcpy(last, title);
cout << title << '\n';
long exStyle = GetWindowLong (hwnd, GWL_EXSTYLE);
exStyle = exStyle | WS_EX_LAYERED;
SetWindowLong (hwnd, GWL_EXSTYLE, exStyle);
SetLayeredWindowAttributes(hwnd, 0, 128, LWA_ALPHA);
}
}
}
# 效果:
(有没有聪明的小朋友可以数出这里面有多少个窗口呢 )
# 原理:
首先,获取鼠标焦点上的窗口句柄并存入 hwnd
里面
HWND hwnd = GetForegroundWindow();
然后获取该窗口的标题并存入 title
中,用于之后的比对及输出
GetWindowTextA(hwnd, title, sizeof(title));
如果这次的窗口标题与上次获取的窗口标题不同,说明要重新设置属性
if(strcmp(last, title))
将 title
复制到 last
中,用于之后的比较
strcpy(last, title);
输出获取到的窗口标题 title
(这段代码本质上还是调试用途,不需要的话可以删掉)
cout << title << '\n';
获取该窗口的窗口样式
long exStyle = GetWindowLong (hwnd, GWL_EXSTYLE);
将窗口样式中添加允许修改透明度
exStyle = exStyle | WS_EX_LAYERED;
将样式重新叠加(请允许我使用如此奇怪的动词 )到窗口上
SetWindowLong (hwnd, GWL_EXSTYLE, exStyle);
将窗口透明度设为 128
(传入的值应介于 0
~ 255
之间,0
为完全透明,255
为不透明)(所以如果你想调整透明度就调整这个值吧),并使用 ALPHA
通道
SetLayeredWindowAttributes(hwnd, 0, 128, LWA_ALPHA);
最后一直循环保证能一直监测并修改透明度
(不要问我为什么要打三个大括号)
}
}
}
然后一个能够一直监测鼠标焦点窗口并实时修改透明度的程序就写好了!
# 后记
千万不要将透明度设为 5
或更小的值,不要问我为什么,因为我刚刚试了一下,然后就再也找不回我的窗口了…