1

我正在尝试研究如何淡出或使 Windows 桌面变暗,然后正常显示桌面的矩形部分。这是一个屏幕区域捕获程序。你可以看到我在发顶后的精确效果 ,网页中的背景也是常用的。非常感谢任何提示/指针/C++ 源代码。到目前为止,谷歌还没有提供帮助。

谢谢,内维尔

4

2 回答 2

8

使用覆盖整个屏幕的分层窗口,但使用颜色键值对其进行绘制,以便感兴趣的矩形区域(应该不暗化的区域)完全用颜色键填充。然后该区域将完全透明,并且不会像桌面的其他部分那样变暗。分层窗口的其余部分应设置为具有恒定的 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;
}
于 2009-10-19T21:10:00.150 回答
-1

官方方法是使用 FadeWindow() api:Windows 在显示控制面板上执行此操作

参见 C 中的标准代码

于 2009-10-21T12:14:38.203 回答