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;
}