本文展示一個經典的 C++ Builder 技巧:透過跨進程 GDI 操作,將滑鼠游標周圍的桌面畫面即時繪製到任務列的「開始」按鈕上,創造透視/鏡像視覺效果。涉及視窗句柄搜尋、裝置內容獲取、位元塊傳輸 (BitBlt/StretchBlt) 核心技術。
Windows 任務列 (SYSTRAY.EXE/explorer.exe) 包含層級視窗:
Shell_TrayWndButton,為主視窗子視窗透過 FindWindow + FindWindowEx 兩層搜尋定位開始按鈕句柄。
// 初始化:取得裝置內容
wnd = FindWindow("Shell_TrayWnd", NULL);
wnd = FindWindowEx(wnd, 0, "Button", NULL);
hdcButton = GetDC(wnd); // 開始按鈕 DC
wnd = GetDesktopWindow();
hdcDesktop = GetDC(wnd); // 桌面 DC
// 定時器觸發:即時繪製
GetCursorPos(&pt); // 取得滑鼠位置
StretchBlt(hdcButton, 0, 0, 60, 25, // 目標:開始按鈕區域
hdcDesktop, pt.x-30, pt.y-12, 60, 25, // 來源:滑鼠周圍 60x25 區域
SRCCOPY); // 直接複製像素
| API | 用途 |
|---|---|
FindWindow/FindWindowEx | 跨進程視窗句柄搜尋 |
GetDC | 取得視窗用戶區裝置內容 |
GetDesktopWindow | 取得桌面視窗句柄 |
GetCursorPos | 取得螢幕座標滑鼠位置 |
StretchBlt | 拉伸/縮放位元塊傳輸,支援縮放 |
ReleaseDC | 釋放裝置內容(程式結束時必須呼叫) |
HWND wnd; HDC hdcButton, hdcDesktop; TPoint pt;Interval=1 近似每幀更新ReleaseDC 釋放兩個 DC,否則造成 GDI 物件洩漏DwmRegisterThumbnail) 提供更安全、高效能的跨視窗內容共享雖具時代侷限性,但本範例完美示範:
適合 Windows 系統程式設計入門教學,理解底層繪圖管線運作。