Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прозрачный ScreenSaver

18K
10 марта 2011 года
imAlex
179 / / 29.07.2010
Доброго времени суток.
Вот решил написать прозрачный или полупрозрачный ScreenSaver. Как делать полупрозрачное или прозрачное окно программы, нашел - проверил - работает. Однако если тот-же код поставить в ScreenSaver, ничего не выходит. Точнее ScreenSaver срабатывает, появляется в диспетчере, полностью прозрачен, но не закрывается (закрываю через диспетчер) и не функционирует.
Код прозрачности:
 
Код:
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);
18K
10 марта 2011 года
imAlex
179 / / 29.07.2010
Понял. Видимо я не там прописывал параметры прозрачности. Сейчас поправил, заработало. Но вот есть все-же загвоздка. При просмотре через "Свойства экрана-Заставка" на рабочем столе отображаются все содержимое, однако если дождаться пока 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;
}

Кто знает по какой причине и как этого можно избежать?
7
10 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
А ты посмотри,с каким параметром запускается скринсейвер.Т.е. банально GetCommandLine/MessageBox в начало кода пихни
Там всё хитро:)
18K
14 марта 2011 года
imAlex
179 / / 29.07.2010
Выдает /p 67700 выключенной защитой паролем (много раз), затем /s. А с включенной защитой выдает /p 329840.
Поигравшись с настройками, я понял, что если не включать защиту паролем, то на экране остаются все иконки, но мне необходимо ее включать.
В принципе возможно есть какой-то другой вариант решения. Задача следующая: необходимо чтоб при включении хранителя внешний вид рабочего стола не изменялся, после хранителя экрана комп должен блокироваться. В момент инициализации (запуска) хранителя в файл записывается время, в момент его уничтожения (выключения) дописывается время.
Я пробовал блокировать ПК в момент уничтожения (выключения) хранителя, но тут есть загвоздка. Если пользователь пошевелит мышкой или нажмет на кнопку клавы, хранитель вырубается и блокирует ПК, однако если пользователь не ввел пароль. через время, появляется хранитель и переписывает время.
7
14 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Гляжу,ты не совсем понял то,что я написал.Или я не совсем понял то,что ты написал:)
Короче,тот параметр,что ты получаешь–это hDC(по-видимому) области,куда можно выводить превью
18K
14 марта 2011 года
imAlex
179 / / 29.07.2010
Я делал сл. образом:
 
Код:
LPTSTR GetCommandLine(VOID);
LRESULT WINAPI ScreenSaverProc (HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)

{
MessageBox (hWnd, GetCommandLine(), NULL, ...)
...

Я так понял. Если нет, поясните, что имелось в виду.
Прошу не сердиться, если я не правильно сделал, я пока только учусь. )))
7
14 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Не,как командную строку выводить,ты всё правильно понял:) Я к тому,понял ли ты смысл выводимых ключей и как ими пользоваться
18K
14 марта 2011 года
imAlex
179 / / 29.07.2010
Чесно говоря не совсем. Ну понятно, что по ключу можно чтото мосмотреть, вот только что искать не совсем понятно.
7
15 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Ты же хотел вывести превьюшку,так?Следовательно
Цитата: imAlex
тот параметр,что ты получаешь–это hDC(по-видимому) области,куда можно выводить превью

Вроде это тебе и надо

18K
15 марта 2011 года
imAlex
179 / / 29.07.2010
Окей. Насколько я понял, hDC 67700 будет означать, что мой прозрачный экран выведется на рабочий стол с иконками. Если это так, то как мне задать этот параметр.
hDC-это область вывода. Тоесть у винды есть некая область вывода (с иконками или без) и мне в нее надо вывести свой прозрачный экран. Так?
7
15 марта 2011 года
@pixo $oft
3.4K / / 20.09.2006
Да не на рабочий стол с иконками выведется.Ты превью хочешь сделать в этом маленьком окошечке?Вот туда и выводит.Или переформулируй свой вопрос,что именно тебе надо сделать
18K
17 марта 2011 года
imAlex
179 / / 29.07.2010
Мне необходимо сделать прозрачную заставку (хранитель экрана). То есть, при включении хранителя, с виду ничего не должно менятся, обычный рабочий стол. Однако при изменении положения мышки, или нажатии на любую кнопку на клавиатуре, хранитель должен завершиться. Так-же необходимо иметь возможность включать защиту паролем. Без защиты паролем у меня все получилось, однако когда включаешь защиту, при включении хранителя с рабочего стола все исчезает.
На данный момент я решил эту задачу сл. образом: есть два хранителя (оба используются без галочки защита паролем в настройке). Первый защиту не имеет, второй при завершении хранитель вызывает команду блокировки (с кода хранителя).
Минусы:
-два хранителя;
-ограничение вожможностей настройки;
-при завершении работы хранителя, ПК блокируется. А надо, чтоб сначало он предлагал разблокироваться, и только если комп разблокировался, то завершать хранитель.
В идеале, окно с вводом логина и паролем чтоб выводилось поверх того-же рабочего стола.
Соответственно, для того, чтоб осуществить задуманное, необходимо понять, где и как надо написать, чтоб иконки с рабочего стола и полоса меню не исчезали.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог