電腦桌面背景可以總是前置嗎?
想問一下大家可以利用操作系統的API介面做到在電腦屏幕上加上一個透明的圖片 無論你打開任何網頁或者word等軟體 這個透明的圖片都總是前置的嗎?具體怎麼做呢?
可以,而且非常簡單,只需要不到50行代碼,如果有使用 WinAPI 的經驗的話應該能過很容易看懂。(Windows Only,需要支持C++11的編譯器,當然你可以手動把 nullptr 都改成 NULL。)
先上效果圖:
除了視覺上的效果之外,正常的操作完全不受影響。切換窗口、顯示桌面等也不會出問題。
這裡列出比較關鍵的幾點:
HWND hwnd = CreateWindowExW(WS_EX_TRANSPARENT | WS_EX_LAYERED, L"Foreground", L"", WS_POPUP, 128, 128, 512, 512, nullptr, nullptr, hInstance, nullptr);
很常見的創建窗口。窗口樣式中,WS_EX_TRANSPARENT 使得滑鼠能過穿透該窗口,使得對下方窗口的操作不受阻礙;WS_EX_LAYERED 使得窗口可以被設置為半透明;WS_POPUP使得窗口不顯示邊框。
SetLayeredWindowAttributes(hwnd, 0, 64, LWA_ALPHA);
將窗口的透明度設置為64。這應該非常容易理解。
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
使得窗口能夠保持置頂。
這些工作做完之後,你就可以在窗口上隨便畫任何你想要的東西了,這裡簡單起見,繪製了一張點陣圖。完整代碼如下:
#include &
HBITMAP hbitmap;
LRESULT CALLBACK windowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch(uMsg) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc1 = BeginPaint(hwnd, ps);
HDC hdc2 = CreateCompatibleDC(hdc1);
SelectObject(hdc2, hbitmap);
BitBlt(hdc1, 0, 0, 512, 512, hdc2, 0, 0, SRCCOPY);
DeleteDC(hdc2);
EndPaint(hwnd, ps);
return 0;
}
case WM_DESTROY: PostQuitMessage(0); return 0;
default: return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSW wc = {0, windowProc, 0, 0, hInstance, LoadIcon(nullptr, IDI_APPLICATION), LoadCursor(nullptr, IDC_ARROW), static_cast&
RegisterClassW(wc);
HWND hwnd = CreateWindowExW(WS_EX_TRANSPARENT | WS_EX_LAYERED, L"Foreground", L"", WS_POPUP, 128, 128, 512, 512, nullptr, nullptr, hInstance, nullptr);
ShowWindow(hwnd, SW_SHOW);
SetLayeredWindowAttributes(hwnd, 0, 64, LWA_ALPHA);
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
hbitmap = static_cast&
MSG msg;
while(GetMessage(msg, nullptr, 0, 0)) {
TranslateMessage(msg);
DispatchMessage(msg);
}
DeleteObject(hbitmap);
return 0;
}
當然這只是一個示例啦,還是很多問題:
- 無法調整窗口的位置
- 任務欄上依然留有窗口的圖標
- ……
如果你不能編譯的話,可以試一下編譯好的版本:https://pan.baidu.com/s/1gfoXMSF ,試完後關閉程序只需要右鍵點擊任務欄上窗口的圖標並關閉即可。在 Windows 7 上能夠正常運行,歡迎反饋Bug。
推薦閱讀:
※老師教的MFC,可是win10不能安裝vc++6.0怎麼辦?
※C++、Visual C++、MFC(編譯和封裝)之間的關係是什麼?
※一個月怎麼寫一個窗口程序?
※現在(2013年12月)學習 MFC 的意義是什麼?