Finestra che nasconde il desktop durante la cattura schermo

di il
0 risposte

Finestra che nasconde il desktop durante la cattura schermo

Salve a tutti, sto cercando di creare un programma che mi copra completamente il desktop con una immagine nera, che consenta di interagire con tutti gli ogetti sottostanti e che questa finestra non venga catturata dalla cattura schermo.

Il codice sottostante fa il suo dovere, ma ho un problema, se premo il tasto windows o faccio alt+tab la traybar va sopra alla finestra.
Io vorrei che si la traybar o le anteprime delle varie applicazioni compaiano, ma sempre nascoste dalla finestra. Con questo approccio posso ottenere questo risultato? 

bool BlackScreenManager::create()
{

    /*
    // Crea una finestra a schermo intero UN SOLO MONITOR
    BlackScreen = CreateWindowEx(
        WS_EX_LAYERED | WS_EX_TRANSPARENT| WS_EX_TOPMOST,
        L"BlackWindow", L"",
        WS_POPUP,
        0, 0,
        GetSystemMetrics(SM_CXSCREEN),
        GetSystemMetrics(SM_CYSCREEN),
        NULL, NULL, _wc.hInstance, NULL);
    */

    // Crea una finestra a schermo intero(virtual screen) senza bordi per tutta l'area virtuale (tutti gli schermi) 
    BlackScreen = CreateWindowEx(
        WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW, // Estensione per la trasparenza e per restare in primo piano

        L"BlackWindow", L"",
        WS_POPUP,
        0,
        0,

        GetSystemMetrics(SM_CXSCREEN),
        GetSystemMetrics(SM_CYSCREEN),
        NULL, NULL, _wc.hInstance, NULL);

    if (BlackScreen)
    {
        // Calcola le dimensioni e la posizione della label di testo sullo schermo principale
        HFONT hfFont = CreateFont(40, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, DEFAULT_PITCH, L"Roboto");

        // Ottieni coordinate del monitor principale
        int primaryWidth = GetSystemMetrics(SM_CXSCREEN);
        int primaryHeight = GetSystemMetrics(SM_CYSCREEN);
        int VirtualOffsetX = 0;
        //NB offset di sinistra è sempre minore o uguale a 0
        int VirtualOffsetY = 0;

        // Calcola posizione e dimensioni della label al centro dello schermo principale
        int Label_W = primaryWidth / 3;
        int Label_H = primaryHeight / 6;
        int Label_X = (-VirtualOffsetX) + (primaryWidth - Label_W) / 2;
        int Label_Y = VirtualOffsetY + (primaryHeight - Label_H) / 2;
        //colore del testo

        HWND hWndLabel =
            CreateWindowEx(
                WS_EX_TRANSPARENT,
                L"STATIC",
                L"",
                WS_CHILD | WS_VISIBLE | SS_CENTER,
                Label_X,
                Label_Y,
                Label_W,
                Label_H,
                BlackScreen,
                NULL,
                _wc.hInstance,
                NULL);

        if (hWndLabel)
        {
            //
            std::wstring  MSG = L"Testo di esempio";

            SendMessage(hWndLabel, WM_SETTEXT, NULL, (LPARAM)MSG.c_str());
            SendMessage(hWndLabel, WM_SETFONT, (WPARAM)hfFont, NULL);
        }


        // Imposta la finestra come trasparente (con un'opacità parziale)
        SetLayeredWindowAttributes(BlackScreen, RGB(0, 0, 0), 255, LWA_ALPHA);

        // Impedisce l'interazione con la finestra (clicc-through)
        //SetWindowLong(BlackScreen, GWL_EXSTYLE, GetWindowLong(BlackScreen, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT);
        // Imposta la finestra in primo piano
        SetWindowPos(BlackScreen, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

        // Aggiungi il blocco per non essere coperto dalla barra delle applicazioni
        SetWindowPos(BlackScreen, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

        // Mostra la finestra
        ShowWindow(BlackScreen, SW_SHOW);

        UpdateWindow(BlackScreen);
        // Mantieni la finestra sopra tutto
        KeepWindowOnTop(BlackScreen);

        SetWindowDisplayAffinity(BlackScreen, WDA_EXCLUDEFROMCAPTURE);
 

        return true;
    }
    else
        return false;
}
Devi accedere o registrarti per scrivere nel forum
0 risposte