Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] exe в скринсейвер

Ответить
Настройки темы
Разное - [решено] exe в скринсейвер
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Хочу написать скринсейвер "шум ТВ-эфира". Как экзешник превратить в скринсейвер, который винда понимает? просто переименовать?

Отправлено: 07:58, 17-11-2009

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата pva:
просто переименовать? »
Да, вроде бы просто переименовать в .scr и закинуть в %windir%\system32

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:39, 17-11-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


pva, кроме смены расширение, в хранителе экрана нужно обеспечить распознавание ключей
Цитата:
/S – для нормально запуска.
/P – для запуска в режиме предварительного просмотра.
...
/C – для редактирования настроек хранителя. Когда в свойствах экрана в закладке «Screen saver» ты жмешь «Setting» хранителю передается именно этот ключик. Ну и хрен с ним.
/A – самый ненужный нам ключик. Служит для открытия окошка с предложением ввести пароль. Если когда-нибудь захочешь запаролить заставку придется юзать его.
>>Пишем собственный хранитель экрана>>
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:55, 17-11-2009 | #3

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


кому понравится - дорабатывайте, только не забудьте меня добрым именем в about помянуть
если не хватает какие библиотечек - пишите, дошлю.
Код: Выделить весь код
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
//---------------------------------------------------------------------------

class sampler_t
{
public:
    sampler_t(const double& dt);
    void set_dt(const double& dt) {_dt=dt;}
    double get();

private:
    double _t, _dt, _a, _b, _c, _d;
    double _p[4];
    double _get();
};

inline double sampler_t::_get()
{
    return double(rand())/RAND_MAX;
}

sampler_t::sampler_t(const double& dt) :
    _t(), _dt(dt), _a(), _b(), _c(), _d()
{
    _p[0] = _get();
    _p[1] = _get();
    _p[2] = _get();
    _p[3] = _get();
}

double sampler_t::get()
{
    _t += _dt;

    if (_t>=1.)
    {
        _t -= 1.;

        _p[0] = _p[1];
        _p[1] = _p[2];
        _p[2] = _p[3];
        _p[3] = _get();

        _a = -0.5*_p[0] + 1.5*_p[1] - 1.5*_p[2] + 0.5*_p[3];
        _b =  1.0*_p[0] - 2.5*_p[1] + 2.0*_p[2] - 0.5*_p[3];
        _c = -0.5*_p[0] + 0.5*_p[2];
        _d = _p[1];
    }

    double t2=_t*_t, t3=t2*_t;

    return min(1., max(0., _a*t3 + _b*t2 + _c*_t + _d));
}
//---------------------------------------------------------------------------

class job_t
{
public:
    ~job_t();
    job_t();
    void operator()();

private:
    vector<unsigned char> _bm_data;
    BITMAPINFO* _bmi;
    unsigned char* _bits;
    sampler_t _sampler_main, _sampler_freq;
    unsigned _bar, _arrow_color;
    const wchar_t* _atom;
    HWND    _window;
    HFONT   _font;


    void _fill_bits(unsigned char* first, unsigned char* last);

    void render_all();
    void cpu_step();
    
    static long __stdcall _wnd_proc(HWND hwnd, unsigned code, unsigned wparam, long lparam);
};

job_t job;

job_t::~job_t()
{
    DeleteObject(_font);
    DestroyWindow(_window);
}

job_t::job_t() :
    _bm_data(800*600 + 256*4 + sizeof(BITMAPINFOHEADER)),
    _bmi    (reinterpret_cast<BITMAPINFO*>(&_bm_data[0])),
    _bits   (&_bm_data[256*4 + sizeof(BITMAPINFOHEADER)]),
    _sampler_main(.102134941),
    _sampler_freq(.1034941),
    _bar(),
    _arrow_color(0x00ffff),
    _font(CreateFont(32, 16, 0, 0, FW_BOLD, 0, 0, 0, 0,
            OUT_RASTER_PRECIS, 0, 0, FIXED_PITCH, 0))
{
    _bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    _bmi->bmiHeader.biWidth  = 800;
    _bmi->bmiHeader.biHeight = 600;
    _bmi->bmiHeader.biPlanes = 1;
    _bmi->bmiHeader.biBitCount = 8;

    WNDCLASS wcla = {0, _wnd_proc, 0, 4, GetModuleHandle(0),
        LoadIcon(0, IDI_APPLICATION), 0,
        /*HBRUSH(COLOR_WINDOW + 1)*/0, 0, L"Window"};

    _atom = reinterpret_cast<const wchar_t*>(RegisterClass(&wcla));

    _window = CreateWindowEx(WS_EX_TOPMOST, _atom, L"GDI+ Window", WS_POPUP|WS_VISIBLE|WS_MAXIMIZE,
            10, 10, 800, 600, 0, 0, 0, 0);

    SetTimer(_window, 101, 1000/25, 0);
    SetTimer(_window, 102, 973, 0);
    SetTimer(_window, 103, 333, 0);
    ShowCursor(false);
}

void job_t::operator()()
{
    MSG cmsg;

//  while(PeekMessage(&cmsg, _window, 0x200, 0x20a, PM_REMOVE)) {}
//  while(PeekMessage(&cmsg, _window, 0x100, 0x107, PM_REMOVE)) {}

    while(GetMessage(&cmsg, 0, 0, 0)>0)
    {
        DispatchMessage(&cmsg);
    }
}


void job_t::render_all()
{
    _fill_bits(_bits, _bits + _bmi->bmiHeader.biWidth*_bmi->bmiHeader.biHeight);
    long frame_pos = 10 + 50./(_sampler_main.get() + 1.);

    HDC dc = GetDC(_window);
    SetBkMode(dc, TRANSPARENT);
    SelectObject(dc, _font);

    RECT rect;
    GetClientRect(_window, &rect);
    
    StretchDIBits(dc, 0, 0, rect.right, rect.bottom,
            0, 0, _bmi->bmiHeader.biWidth, _bmi->bmiHeader.biHeight,
                    _bits, _bmi, DIB_RGB_COLORS, SRCCOPY);
//    SetDIBitsToDevice(dc, 0, 0, _bmi->bmiHeader.biWidth, _bmi->bmiHeader.biHeight,
//                    0, 0, 0, _bmi->bmiHeader.biHeight, _bits, _bmi, 0);
    
    static wchar_t text[] = L"Searching [012345678901234567890123456789]";
    wchar_t* caret = text + 12 + (_bar);
    
    fill(text + 11, caret, '|');
    fill(caret, text + 11 + 30, '.');
    SetTextColor(dc, 0x00ff00);
    TextOut(dc, 80, frame_pos, text, 12 + 30);

    static wchar_t arrows[] = L">>>";
    SetTextColor(dc, _arrow_color);
    TextOut(dc, 10, frame_pos, arrows, 3);

    ReleaseDC(_window, dc);
}

void job_t::cpu_step()
{
    if (28<_bar) _bar=0;
    
    _sampler_main.set_dt(0.02*pow(1.12234, ++_bar));

    //_sampler_main.set_dt(0.00342143897*_sampler_freq.get());
}

void job_t::_fill_bits(unsigned char* first, unsigned char* last)
{
    {
        double gain = 0.93 + 0.06*_sampler_freq.get();
        unsigned* colors = reinterpret_cast<unsigned*>(&_bm_data[sizeof(BITMAPINFOHEADER)]);

        for (unsigned n=0; n<256; ++n)
        {
            colors[n] = 0x10101*unsigned(255.*pow(gain,n));
        }
    }



    for (; first!=last; ++first)
    {
        first[0] = _sampler_main.get()*255;
    }
}

long __stdcall job_t::_wnd_proc(HWND hwnd, unsigned code, unsigned wparam, long lparam)
{
    static long __mouse_lparam = -1;
    
    if (code==WM_PAINT)
    {
        ValidateRect(hwnd, 0);
    }
    else if (code==WM_TIMER)
    {
        switch (wparam)
        {
            case 101 : job.render_all(); break;
            case 102 : job.cpu_step(); break;
            case 103 : job._arrow_color^=0xffffff; break;
        }
    }
    else if (WM_MOUSEFIRST <= code && code <= WM_MOUSELAST)
    {       
        if (__mouse_lparam!=-1 && __mouse_lparam!=lparam)
        {
            PostQuitMessage(0);
        }
         __mouse_lparam = lparam;
    }
    else if (code==WM_CLOSE || (WM_KEYFIRST <= code && code <= WM_KEYLAST))
    {
        PostQuitMessage(0);
    }
    else
    {
        return DefWindowProc(hwnd, code, wparam, lparam);
    }
    
    return 0;
}

int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
        job();
    }
    catch(exception& e)
    {
        MessageBoxA(0, e.what(), 0, MB_OK|MB_ICONERROR);
    }
    return 0;
}
//---------------------------------------------------------------------------

Последний раз редактировалось pva, 25-02-2012 в 11:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:15, 20-11-2009 | #4


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


pva, У меня ругнулось на отсутствие заголовочного файла. Прописал там где надо
Код: Выделить весь код
#include <math.h>
А так, прикольно получилось.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:01, 20-11-2009 | #5

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Вот ещё 2 варианта: один через D3D 9, другой через GDI+. В D3d не знаю как сделать печать текста и не очень удобно работать с кадром, поэтому там изобразил только шум. Как нарисовать текст на back buffer или на либо в текстуру? у меня DC почему-то не берётся, а как узнать ошибку - не знаю.
У меня на ноуте HP530 через GDI+ загрузка одного ядра 50%, через D3D 5%, причём качество размытия гораздо выхе, хотя и там и там линейноый фильтр. Видюха встроенная.

Последний раз редактировалось pva, 25-02-2012 в 11:59.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:37, 22-11-2009 | #6


Аватара для Habetdin


Автор проектов


Сообщения: 3651
Благодарности: 1498

Профиль | Сайт | Отправить PM | Цитировать


pva, а почему тот, что через d3d, не на весь экран?
Кстати без текста лучше

-------
Рекомендую: $25 на тест виртуального сервера (VPS) за регистрацию по ссылке


Последний раз редактировалось Habetdin, 23-11-2009 в 13:42.


Отправлено: 20:58, 22-11-2009 | #7

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


На весь экран отладку вести неудобно. Там при переключении фокуса полурушится объект IDirect3DDevice9, который я пока обратно не умею восстановить (а так же отловить момент его сброса). А в оконном режиме он хорошо и в фоне работает и ресурсы расшаривает с другими программами.

Отправлено: 07:19, 23-11-2009 | #8


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


pva, а есть ли подобные функции (шум в картинке) в классическом GDI? Что бы разобраться на функциональном уровне, а не сразу в объектном GDI+/Direct3D
У меня есть функциональное предложение по коду, в процессе поиска предлагаю "находить каналы", хотя бы на профилактике.

Код: Выделить весь код
void GeneratorTsvetnyhPolos_GDI(HDC *hDc, RECT *rectBar, int OffSet)
{    
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(255, 255, 255)));    //Как вариант Rectangle
    rectBar->left = rectBar->right;
    rectBar->right += OffSet;
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(196, 196, 0)));
    rectBar->left = rectBar->right;
    rectBar->right += OffSet;
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(0, 196, 196)));
    rectBar->left = rectBar->right;
    rectBar->right += OffSet;
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(0, 196, 0)));
    rectBar->left = rectBar->right;
    rectBar->right += OffSet;
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(196, 0, 196)));
    rectBar->left = rectBar->right;
    rectBar->right += OffSet;
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(196, 0, 0)));
    rectBar->left = rectBar->right;
    rectBar->right += OffSet;
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(0, 0, 196)));
    rectBar->left = rectBar->right;
    rectBar->right += OffSet;
    FillRect(*hDc, rectBar, CreateSolidBrush(RGB(0, 0, 0)));
}
//...
        case WM_PAINT:
        {
            RECT rect = {0};
            GetWindowRect(hWnd, &rect);
            rect.right = (rect.right - rect.left) / 8;
            rect.left = 0;
            rect.bottom = rect.bottom - rect.top;
            rect.top = 0;

            PAINTSTRUCT ps = {0};            
            HDC hDc = BeginPaint(hWnd, &ps);
            GeneratorTsvetnyhPolos_GDI(&hDc, &rect, rect.right);
            EndPaint(hWnd, &ps);
        }
        break;
Код правда с применением функций GDI, по причине озвученной выше.

Отправлено: 00:59, 26-11-2009 | #9

pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


У моих коллег было менее сромное предложение предлагали сканить видеофайлы из папки и вставлять их в качестве каналов.
Чтобы не перегружать систему каким-то там скринсейвером, я хотел сделать через директ 3д, но вот не разобрался ещё как на картинку наложить текст. Только если побитно вручную. Хотя вот сейчас подумал что можно накопировать букв с поверхности со включенным альфаблендингом.
Есть ещё одна проблема с шумом: имитация настройки на различные длины волн в д3д делается растяжением картинки с шумом. У меня не получилось достучаться до битов растянутой картинки IDirect3DSurface9::Lock возвращает ошибку.
Цитата Admiral:
подобные функции (шум в картинке) в классическом GDI »
я не нашёл, думаю нет таких

Отправлено: 11:26, 26-11-2009 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] exe в скринсейвер

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Скринсейвер Windows XP (logon.scr) Котяра Хочу все знать 4 23-01-2012 16:13
[решено] настроить скринсейвер в сборке San_dr Автоматическая установка Windows 2000/XP/2003 1 22-09-2009 19:44
[решено] Интересует куда делись Regedit.exe | NTSD.exe | NETSETUP.exe | TELNET.exe Ricardo Проект WinStyle 11 30-07-2009 23:36
Как установить НЕстандартный скринсейвер через групповую политику? ANR Microsoft Windows NT/2000/2003 6 06-11-2007 09:00
Принудительный скринсейвер. GreenIce Microsoft Windows NT/2000/2003 3 29-06-2007 15:58




 
Переход