我正在尝试研究如何淡出或使 Windows 桌面变暗,然后正常显示桌面的矩形部分。这是一个屏幕区域捕获程序。你可以看到我在精发顶后的精确效果 ,网页中的背景也是常用的。非常感谢任何提示/指针/C++ 源代码。到目前为止,谷歌还没有提供帮助。
谢谢,内维尔
我正在尝试研究如何淡出或使 Windows 桌面变暗,然后正常显示桌面的矩形部分。这是一个屏幕区域捕获程序。你可以看到我在精发顶后的精确效果 ,网页中的背景也是常用的。非常感谢任何提示/指针/C++ 源代码。到目前为止,谷歌还没有提供帮助。
谢谢,内维尔
使用覆盖整个屏幕的分层窗口,但使用颜色键值对其进行绘制,以便感兴趣的矩形区域(应该不暗化的区域)完全用颜色键填充。然后该区域将完全透明,并且不会像桌面的其他部分那样变暗。分层窗口的其余部分应设置为具有恒定的 alpha 值,该值大部分是透明的并填充有深色。
这是一个完整的工作示例:
#include “stdafx.h” #include "ScreenCapper.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE 提示;// 当前实例 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文字 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT 回调 WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK 关于(HWND,UINT,WPARAM,LPARAM); 常量 COLORREF 透明颜色 = RGB(255,0,0); // 纯红色是颜色键,或者完全透明的颜色 const BYTE 整体TranparencyAmount = 90;// 共 255 个 整数桌面宽度,桌面高度; int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); DesktopWidth = GetSystemMetrics(SM_CXSCREEN); DesktopHeight = GetSystemMetrics(SM_CYSCREEN); 味精味精; HACCEL hAccelTable; LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_SCREENCAPPER, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) { 返回错误; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SCREENCAPPER)); while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); 调度消息(&msg); } } 返回 (int) msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; memset(&wcex,0,sizeof(WNDCLASSEX)); wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SCREENCAPPER)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //wcex.lpszMenuName = MAKEINTRESOURCE(IDC_SCREENCAPPER); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 返回 RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; HWND hWnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle,WS_POPUP, 0, 0, DesktopWidth, DesktopHeight, NULL, NULL, hInstance, NULL); 如果(!hWnd) 返回错误; SetLayeredWindowAttributes(hWnd,transparentColor,32,LWA_COLORKEY | LWA_ALPHA); ShowWindow(hWnd, nCmdShow); 更新窗口(hWnd); 返回真; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; 油漆结构 ps; 高密度硬盘; 如果(消息 == WM_COMMAND) { wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 解析菜单选择: 开关(wmId) { 案例IDM_EXIT: 销毁窗口(hWnd); 休息; 默认: 返回 DefWindowProc(hWnd, 消息, wParam, lParam); } } 否则如果(消息 == WM_PAINT) { hdc = BeginPaint(hWnd, &ps); HBRUSH hDarkBackgroundBrush = CreateSolidBrush(RGB(0,0,0)); HBRUSH hRegionOfInterestBrush = CreateSolidBrush(transparentColor); 矩形屏幕矩形; screenRect.left = screenRect.top = 0; screenRect.right = 桌面宽度; screenRect.bottom = 桌面高度; 矩形兴趣矩形; interestRect.left = interestRect.top = 300; interestRect.right = interestRect.bottom = 600; FillRect(hdc,&screenRect,hDarkBackgroundBrush); FillRect(hdc,&interestRect,hRegionOfInterestBrush); DeleteObject(hDarkBackgroundBrush); DeleteObject(hRegionOfInterestBrush); EndPaint(hWnd, &ps); } 否则如果(消息 == WM_DESTROY) { PostQuitMessage(0); } 别的 返回 DefWindowProc(hWnd, 消息, wParam, lParam); 返回0; }
官方方法是使用 FadeWindow() api:Windows 在显示控制面板上执行此操作