|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] exe в скринсейвер |
|
Разное - [решено] exe в скринсейвер
|
![]() Ветеран Сообщения: 1180 |
Хочу написать скринсейвер "шум ТВ-эфира". Как экзешник превратить в скринсейвер, который винда понимает? просто переименовать?
|
|
Отправлено: 07:58, 17-11-2009 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата pva:
|
|
------- Отправлено: 13:39, 17-11-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать pva, кроме смены расширение, в хранителе экрана нужно обеспечить распознавание ключей
Цитата:
|
|
Отправлено: 13:55, 17-11-2009 | #3 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить 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 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать |
|
------- Отправлено: 17:01, 20-11-2009 | #5 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить 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 |
![]() Сообщения: 3652
|
Профиль | Сайт | Отправить PM | Цитировать pva, а почему тот, что через d3d, не на весь экран?
![]() Кстати без текста лучше ![]() |
------- Последний раз редактировалось Habetdin, 23-11-2009 в 13:42. Отправлено: 20:58, 22-11-2009 | #7 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать На весь экран отладку вести неудобно. Там при переключении фокуса полурушится объект IDirect3DDevice9, который я пока обратно не умею восстановить (а так же отловить момент его сброса). А в оконном режиме он хорошо и в фоне работает и ресурсы расшаривает с другими программами.
|
Отправлено: 07:19, 23-11-2009 | #8 |
Ветеран Сообщения: 3320
|
Профиль | Отправить 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; |
Отправлено: 00:59, 26-11-2009 | #9 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать У моих коллег было менее сромное предложение
![]() Чтобы не перегружать систему каким-то там скринсейвером, я хотел сделать через директ 3д, но вот не разобрался ещё как на картинку наложить текст. Только если побитно вручную. Хотя вот сейчас подумал что можно накопировать букв с поверхности со включенным альфаблендингом. Есть ещё одна проблема с шумом: имитация настройки на различные длины волн в д3д делается растяжением картинки с шумом. У меня не получилось достучаться до битов растянутой картинки ![]() Цитата Admiral:
|
|
Отправлено: 11:26, 26-11-2009 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Скринсейвер 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 |
|