int Transparency = 75;//насколько прозрачным будет окно (0-100%)
long ExtStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0 , (255 * Transparency) / 100,
LWA_ALPHA);
Прозрачный ScreenSaver
Вот решил написать прозрачный или полупрозрачный ScreenSaver. Как делать полупрозрачное или прозрачное окно программы, нашел - проверил - работает. Однако если тот-же код поставить в ScreenSaver, ничего не выходит. Точнее ScreenSaver срабатывает, появляется в диспетчере, полностью прозрачен, но не закрывается (закрываю через диспетчер) и не функционирует.
Код прозрачности:
Код:
Код программы:
Код:
#pragma comment(lib, "Scrnsave.lib")
#pragma comment(lib, "comctl32.lib")
#include <windows.h>
#include <scrnsave.h>
#include <commctrl.h>
#include <math.h>
LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
static PAINTSTRUCT ps = {NULL};
static HDC hDC = NULL;
static HPEN hPen1;
switch(message)
{
case WM_CREATE:
hPen1 = (HPEN)GetStockObject(WHITE_PEN);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
if(fChildPreview)
{
SetBkColor(hDC, RGB(0, 0, 0));
SetTextColor(hDC, RGB(255, 255, 0));
char szPreview[] = ":-)";
TextOut(hDC, 15, 45, szPreview, strlen(szPreview));
}
else
{
int Transparency = 75;//насколько прозрачным будет окно (0-100%)
long ExtStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0 , (255 * Transparency) / 100,
LWA_ALPHA);
}
EndPaint(hWnd, &ps);
break; default:
return DefScreenSaverProc(hWnd, message, wParam, lParam);
}
return 0;
}
BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return true;
}
BOOL WINAPI RegisterDialogClasses (HANDLE hInst)
{
return true;
}
#pragma comment(lib, "comctl32.lib")
#include <windows.h>
#include <scrnsave.h>
#include <commctrl.h>
#include <math.h>
LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
static PAINTSTRUCT ps = {NULL};
static HDC hDC = NULL;
static HPEN hPen1;
switch(message)
{
case WM_CREATE:
hPen1 = (HPEN)GetStockObject(WHITE_PEN);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
if(fChildPreview)
{
SetBkColor(hDC, RGB(0, 0, 0));
SetTextColor(hDC, RGB(255, 255, 0));
char szPreview[] = ":-)";
TextOut(hDC, 15, 45, szPreview, strlen(szPreview));
}
else
{
int Transparency = 75;//насколько прозрачным будет окно (0-100%)
long ExtStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
SetWindowLong(hWnd, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd, 0 , (255 * Transparency) / 100,
LWA_ALPHA);
}
EndPaint(hWnd, &ps);
break; default:
return DefScreenSaverProc(hWnd, message, wParam, lParam);
}
return 0;
}
BOOL WINAPI ScreenSaverConfigureDialog (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return true;
}
BOOL WINAPI RegisterDialogClasses (HANDLE hInst)
{
return true;
}
Кто знает по какой причине и как этого можно избежать?
Там всё хитро:)
Поигравшись с настройками, я понял, что если не включать защиту паролем, то на экране остаются все иконки, но мне необходимо ее включать.
В принципе возможно есть какой-то другой вариант решения. Задача следующая: необходимо чтоб при включении хранителя внешний вид рабочего стола не изменялся, после хранителя экрана комп должен блокироваться. В момент инициализации (запуска) хранителя в файл записывается время, в момент его уничтожения (выключения) дописывается время.
Я пробовал блокировать ПК в момент уничтожения (выключения) хранителя, но тут есть загвоздка. Если пользователь пошевелит мышкой или нажмет на кнопку клавы, хранитель вырубается и блокирует ПК, однако если пользователь не ввел пароль. через время, появляется хранитель и переписывает время.
Короче,тот параметр,что ты получаешь–это hDC(по-видимому) области,куда можно выводить превью
Код:
LPTSTR GetCommandLine(VOID);
LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
MessageBox (hWnd, GetCommandLine(), NULL, ...)
...
LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
MessageBox (hWnd, GetCommandLine(), NULL, ...)
...
Я так понял. Если нет, поясните, что имелось в виду.
Прошу не сердиться, если я не правильно сделал, я пока только учусь. )))
Не,как командную строку выводить,ты всё правильно понял:) Я к тому,понял ли ты смысл выводимых ключей и как ими пользоваться
Чесно говоря не совсем. Ну понятно, что по ключу можно чтото мосмотреть, вот только что искать не совсем понятно.
Цитата: imAlex
тот параметр,что ты получаешь–это hDC(по-видимому) области,куда можно выводить превью
Вроде это тебе и надо
hDC-это область вывода. Тоесть у винды есть некая область вывода (с иконками или без) и мне в нее надо вывести свой прозрачный экран. Так?
Да не на рабочий стол с иконками выведется.Ты превью хочешь сделать в этом маленьком окошечке?Вот туда и выводит.Или переформулируй свой вопрос,что именно тебе надо сделать
На данный момент я решил эту задачу сл. образом: есть два хранителя (оба используются без галочки защита паролем в настройке). Первый защиту не имеет, второй при завершении хранитель вызывает команду блокировки (с кода хранителя).
Минусы:
-два хранителя;
-ограничение вожможностей настройки;
-при завершении работы хранителя, ПК блокируется. А надо, чтоб сначало он предлагал разблокироваться, и только если комп разблокировался, то завершать хранитель.
В идеале, окно с вводом логина и паролем чтоб выводилось поверх того-же рабочего стола.
Соответственно, для того, чтоб осуществить задуманное, необходимо понять, где и как надо написать, чтоб иконки с рабочего стола и полоса меню не исчезали.