说明:该程序为临摹改良(😀)作品,源地址C/C++屏幕恶搞程序
效果展示
上代码
#include <windows.h>
#define NUM 11451
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int main() // Renamed WinMain to main
{
static int iKeep[NUM][4];
HDC hdcScr, hdcMem;
int cx, cy;
HBITMAP hBitmap;
HWND hwnd;
int i, j, x1, y1, x2, y2;
if (LockWindowUpdate(hwnd = GetDesktopWindow()))
{
hdcScr = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE);
hdcMem = CreateCompatibleDC(hdcScr);
cx = GetSystemMetrics(SM_CXSCREEN) / 10;
cy = GetSystemMetrics(SM_CYSCREEN) / 10;
hBitmap = CreateCompatibleBitmap(hdcScr, cx, cy);
SelectObject(hdcMem, hBitmap);a
srand((int)GetCurrentTime());
for (i = 0; i < 2; i++)
for (j = 0; j < NUM; j++)
{
LockWindowUpdate(hwnd = GetDesktopWindow());
if (i == 0)
{
iKeep[j][0] = x1 = cx * (rand() % 10);
iKeep[j][1] = y1 = cy * (rand() % 10);
iKeep[j][2] = x2 = cx * (rand() % 10);
iKeep[j][3] = y2 = cy * (rand() % 10);
}
else
{
x1 = iKeep[NUM - 1 - j][0];
y1 = iKeep[NUM - 1 - j][1];
x2 = iKeep[NUM - 1 - j][2];
y2 = iKeep[NUM - 1 - j][3];
}
BitBlt(hdcMem, 0, 0, cx, cy, hdcScr, x1, y1, SRCCOPY);
BitBlt(hdcScr, x1, y1, cx, cy, hdcScr, x2, y2, SRCCOPY);
BitBlt(hdcScr, x2, y2, cx, cy, hdcMem, 0, 0, SRCCOPY);
}
DeleteDC(hdcMem);
ReleaseDC(hwnd, hdcScr);
DeleteObject(hBitmap);
}
return 0;
}
代码会在桌面上随机选取一些区域,并将它们的内容进行快速的随机移动和交换,产生一种视觉上的动态效果。
原理:
- 定义了一个较大的二维数组
iKeep
来存储一些坐标信息。 - 通过
GetDesktopWindow
获取桌面窗口句柄,使用相关的图形设备接口(GDI)函数进行操作。 CreateCompatibleDC
和CreateCompatibleBitmap
创建与屏幕兼容的设备上下文和位图。- 使用
rand
函数生成随机数来确定移动区域的起始和结束坐标。 - 通过
BitBlt
函数在不同的设备上下文之间复制位图,实现区域的移动效果。
这边也改良了一个加速版本
通过减少循环次数和每次操作之间的等待时间来加快随机移动的速度:
#include <windows.h>
#include <ctime>
#define NUM 5000 // 减少循环次数以加快速度
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int main()
{
static int iKeep[NUM][4];
HDC hdcScr, hdcMem;
int cx, cy;
HBITMAP hBitmap;
HWND hwnd;
int i, j, x1, y1, x2, y2;
srand(static_cast<unsigned int>(time(nullptr))); // 初始化随机数生成器
if (LockWindowUpdate(hwnd = GetDesktopWindow()))
{
hdcScr = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE);
hdcMem = CreateCompatibleDC(hdcScr);
cx = GetSystemMetrics(SM_CXSCREEN) / 10;
cy = GetSystemMetrics(SM_CYSCREEN) / 10;
hBitmap = CreateCompatibleBitmap(hdcScr, cx, cy);
SelectObject(hdcMem, hBitmap);
for (i = 0; i < 1; // 将循环次数从 2 减少为 1
i++)
{
for (j = 0; j < NUM; j++)
{
LockWindowUpdate(hwnd = GetDesktopWindow());
if (i == 0)
{
iKeep[j][0] = x1 = cx * (rand() % 10);
iKeep[j][1] = y1 = cy * (rand() % 10);
iKeep[j][2] = x2 = cx * (rand() % 10);
iKeep[j][3] = y2 = cy * (rand() % 10);
}
else
{
x1 = iKeep[NUM - 1 - j][0];
y1 = iKeep[NUM - 1 - j][1];
x2 = iKeep[NUM - 1 - j][2];
y2 = iKeep[NUM - 1 - j][3];
}
BitBlt(hdcMem, 0, 0, cx, cy, hdcScr, x1, y1, SRCCOPY);
BitBlt(hdcScr, x1, y1, cx, cy, hdcScr, x2, y2, SRCCOPY);
BitBlt(hdcScr, x2, y2, cx, cy, hdcMem, 0, 0, SRCCOPY);
// 此处可以添加一些短暂的暂停来控制速度,例如 Sleep(1) 表示暂停 1 毫秒
// Sleep(1);
}
}
DeleteDC(hdcMem);
ReleaseDC(hwnd, hdcScr);
DeleteObject(hBitmap);
}
return 0;
}
将其打包成可执行程序
当然,把代码写出来,想整人的话还得研究怎么用,所以就得把程序打包
我用的是Visual Studio所以就以VS为例
按照以下步骤进行:
第一步:点击 扩展》管理扩展
第二步:搜索Installer,找到第一个微软的那个,然后安装它
下载好之后你需要关闭VS,然后会弹出一个安装程序,一直下一步跟着安装好就行,安装好之后再次打开VS
第三步:在当前的“解决方案” 右键》添加》新建项目
在新建项目这里搜索“setup”,选择第一个Setup Project
选择在setup下的Detected Dependencies,在右侧的Application Folder上找到Add,点击右侧的“项目输出”
弹出的窗口中选择“主输出”即可,点解“确定”,下一步
第四步:生成打包文件
右击 setup 在弹出来的菜单中选择重新生成即可
在资源管理器中选择
进入Debug文件夹,这里的都是安装程序
OK