一個經典的 Windows GDI 惡作劇程序,通過不斷在桌面設備上下文(DC)隨機位置複製像素塊,製造「桌面崩壞」視覺效果。本文提供完整 VC++ 代碼、關鍵 API 解析與安全運行建議。
#include "stdafx.h"
#include
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, "Written by Cooldog. :)", "hehe...", MB_OK);
HDC hDesktopDC;
RECT scrRect;
// 獲取桌面窗口句柄及屏幕分辨率
GetWindowRect(GetDesktopWindow(), &scrRect);
// 獲取桌面設備上下文(DC=0 代表整個屏幕)
hDesktopDC = GetDC((HWND)0);
// 循環 10 萬次:隨機位置複製像素塊
for (long i = 0; i < 100000L; i++) {
int x, y, width, height;
// 隨機目標坐標與寬高(0-3 像素)
x = (rand() % scrRect.right) / 2 - (width = rand() % 3);
y = rand() % scrRect.bottom - (height = rand() % 3);
// 核心:BitBlt 位塊傳輸
// 從 (x+隨機偏移, y-隨機偏移) 複製 width×height 區域到 (x, y)
BitBlt(hDesktopDC,
x, y, x + width, y + height, // 目標矩形
hDesktopDC,
x + rand() % 3 - 1, y - rand() % 2, // 源坐標
SRCCOPY); // 直接複製像素
}
ReleaseDC((HWND)0, hDesktopDC);
InvalidateRect(0, NULL, TRUE); // 強制重繪桌面清理殘留
return 0;
}
| API | 作用 | 關鍵參數 |
|---|---|---|
GetDesktopWindow() | 獲取桌面窗口句柄(覆蓋全屏的特殊窗口) | — |
GetWindowRect(hwnd, &rect) | 獲取窗口屏幕座標矩形 | 輸出 scrRect.right/bottom 為屏寬高 |
GetDC(0) | 獲取屏幕 DC,繪圖直接作用於顯示內存 | HWND=0 代表整個屏幕 |
BitBlt(hdcDest, x, y, w, h, hdcSrc, xSrc, ySrc, SRCCOPY) | 位塊傳輸:從源 DC 複製像素到目標 DC | SRCCOPY 直接複製,不混合 |
ReleaseDC(hwnd, hdc) | 釋放 DC,歸還系統資源 | 必須成對調用,否則 GDI 泄漏 |
InvalidateRect(0, NULL, TRUE) | 標記整個屏幕需重繪,觸發 WM_PAINT 清理 | 第三參數 TRUE=擦除背景 |
x+rand(), y-rand())複製到目標區域(x, y)。InvalidateRect 觸發系統重繪,桌面圖標、任務欄自動恢復正常,無永久損害。GetAsyncKeyState(VK_ESCAPE) 判斷提前退出循環。GetDC(0) 獲取的是重定向表面,BitBlt 效果可能被 DWM 覆蓋或不顯示。DwmEnableComposition(FALSE))或針對特定應用窗口 DC 繪圖。requireAdministrator。該程序演示了 GDI 核心概念:
BitBlt 仍沿用此語義。GetWindowRect 返回屏幕座標。GetDC/ReleaseDC 配對,體現 Windows 資源釋放規範。雖然是惡作劇代碼,但精準展示了 Windows 圖形子系統的底層運作機制。理解這些 API,對開發屏幕截圖、遠程桌面、遊戲覆蓋、UI 自動化等工具具有直接指導意義。