Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Снова про ScreenSaver - так и не получил ответа на свой вопрос:


Alexander ©   (2003-01-08 15:18:00) 

Как написать превьюшку для хранителя экрана на KOL&MCK?


Danil   (2003-01-13 15:10:00) [1]

Супер!!!
Работает!!!
Спасибо, Дмитрий!


PS А MsgOK я тоже для отладки всегда ставлю, если надо...


mdw   (2003-01-13 12:06:00) [2]

MsgOK - нужно убрать, это отладочное:))))


mdw   (2003-01-13 12:03:00) [3]

Попробовал сейчас такой код - работает:
...
private
pi: TProcessInformation;
...

//Запуск "предпросмотра" заставки
procedure TForm1.BitBtn1Click(Sender: PObj);
var si: TStartupInfo;
begin
if OpenDialog.Execute then begin
FillMemory(@si, SizeOf(STARTUPINFO), 0);
si.cb:= sizeof(STARTUPINFO);
FillMemory(@pi, SizeOf(PROCESS_INFORMATION), 0);
MsgOK(mdvDialogEx1.fdFileNames);
MsgOK(Int2Str(Integer(CreateProcess(nil, PChar(OpenDialog.FileName + " /P "+Int2Str(Panel1.Handle)), nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(OpenDialog.FileName)), si, pi))));
end;
end;

//Останов "предпросмотра" заставки
procedure TForm1.Button1Click(Sender: PObj);
begin
TerminateProcess(pi.hProcess, 0);
end;


Danil   (2003-01-12 18:23:00) [4]

Именно так я и пробовал вызывать.
Это я месяц или два назад пробовал. Надо будет сейчас попробовать в PaintBox или в панель на OnPaint вставить. Может, получится...



Да уж, ничего не получается...
Вот так:
procedure TForm1.Panel1Paint(Sender: PControl; DC: HDC);
begin
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr"),
pchar("/P " + int2str(sender.Handle)),
//nil,
nil, SW_SHOWNORMAL);
end;


Заставка стартуется каждый раз при прорисовке панели (а это, как вы знаете, очень часто), но на весь экран.

Вот, что получается, если делать так:
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr /P " + int2str(sender.Handle)),
( "/P " + int2str(sender.Handle)

Именно так я и пробовал вызывать.
Это я месяц или два назад пробовал. Надо будет сейчас попробовать в PaintBox или в панель на OnPaint вставить. Может, получится...



Да уж, ничего не получается...
Вот так:
procedure TForm1.Panel1Paint(Sender: PControl; DC: HDC);
begin
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr"),
pchar("/P " + int2str(sender.Handle)),
//nil,
nil, SW_SHOWNORMAL);
end;


Заставка стартуется каждый раз при прорисовке панели (а это, как вы знаете, очень часто), но на весь экран.

Вот, что получается, если делать так:
shellexecute(0, "open",
pchar("C:\WINDOWS\System32\ssmarque.scr /P " + int2str(sender.Handle)),
//pchar("/P " + int2str(sender.Handle)),
nil,
nil, SW_SHOWNORMAL);

Командная строка выглядит так:
C:\WINDOWS\System32\ssmarque.scr /P 918858
но теперь вообще ничего не запускается. Пробовал без "open" - то же самое. По-моему даже процесс заставки не создаётся.


Alexander   (2003-01-12 10:18:00) [5]

To Danil:
A как ты вызываешь хранитель?
Надо так <хранитель> /P нендл


Danil   (2003-01-12 01:01:00) [6]

Alexanderправильно меня понял: я хочу написать "предпросмотрщик" заставок. Какой компонент использовать для этого?
Я попробовал несколько (панель, форма,...): ничего не подходит.

А надобность, поверьте, есть ;-) : http://www.625.ru/?ssc


Alexander   (2003-01-10 15:18:00) [7]

Но для VCL у меня есть рабочий пример.


mdw   (2003-01-10 14:35:00) [8]

Я думаю с показом формы ничего не получится - там проблема с обработкой собщений. Она на себя перехватывает, вернее приложение.


Alexander   (2003-01-10 14:09:00) [9]

Спасибо, разабрался - воспользовался идеей показа в окне не всей формы, а панели, например. Теперь работает. Правда этот же фокус со всей формой не проходит - не ясно почему. (Win2000).

А по поводу Danil- парень хочет написать свой просмотрщик иконом (подменить системный preview) - интересная задача, правда надобность в этом спорная.


mdw   (2003-01-10 12:13:00) [10]

2Alexander отправил, лови. Доделано не до конца, но то, что тебя иньересует реализованно.


mdw   (2003-01-10 11:41:00) [11]

2Danil ...да........ ни чего не понял......


Danil   (2003-01-10 09:15:00) [12]

Привет всем!

А может, кто-нибудь подскажет, как сделать этот самый Parent, на котором скринсейверы будут делать Preview?
Т.е. я хочу, чтобы на моей форме скринсейверы делали свой Preview, для чего им в качестве 2-го параметра передавать хэндл этого компонента. Только что использовать в качестве этого компонента?


Alexander   (2003-01-10 08:18:00) [13]

вышли, если не сложно - egorov_a_a@tngf.kazan.ru


mdw   (2003-01-09 23:30:00) [14]

C твоей подачи взялся сегодня переделывать под KOL когда-то написанный ScreenSaver... Вроде все работает. Могу прислать. Посмотришь. Т.к. советы это хорошо, а работающий код - всетаки лучше.


Alexander   (2003-01-09 15:32:00) [15]

Для этой формы задаётся родитель. Для KOL я пытаюсь делать так:


Arg := UpperCase(ParamStr(1));

if (Copy(Arg,1,2) = "/A") or (Copy(Arg,1,2) = "-A") or (Copy(Arg,1,1) = "A") then
SSMode := ssSetPwd;

if (Copy(Arg,1,2) = "/P") or (Copy(Arg,1,2) = "-P") or (Copy(Arg,1,1) = "P") then
SSMode := ssPreview;

if (Copy(Arg,1,2) = "/C") or (Copy(Arg,1,2) = "-C") or (Copy(Arg,1,1) = "C") or (Arg = "") then
SSMode := ssConfig;

if (SSMode = ssRun) or (SSMode = ssPreview) then
begin
NewFormSaver(FormSaver, nil);

if (SSMode = ssPreview) then
begin
ParentHandle := Str2Int(ParamStr(2));
GetWindowRect(ParentHandle, ParentRect);

SetWindowLong(FormSaver.Form.Handle, GWL_STYLE, WS_CHILD or WS_VISIBLE);
SetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE,
GetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW or WS_EX_TOOLWINDOW);

SetParent(FormSaver.Form.Handle, ParentHandle);

// FormSaver.Form.Left := 0;
// FormSaver.Form.Top := 0;
// FormSaver.Form.Width := ParentRect.Right - ParentRect.Left;
// FormSaver.Form.Height := ParentRect.Bottom - ParentRect.Top;
end;

( FormSaver.Form)

Для этой формы задаётся родитель. Для KOL я пытаюсь делать так:


Arg := UpperCase(ParamStr(1));

if (Copy(Arg,1,2) = "/A") or (Copy(Arg,1,2) = "-A") or (Copy(Arg,1,1) = "A") then
SSMode := ssSetPwd;

if (Copy(Arg,1,2) = "/P") or (Copy(Arg,1,2) = "-P") or (Copy(Arg,1,1) = "P") then
SSMode := ssPreview;

if (Copy(Arg,1,2) = "/C") or (Copy(Arg,1,2) = "-C") or (Copy(Arg,1,1) = "C") or (Arg = "") then
SSMode := ssConfig;

if (SSMode = ssRun) or (SSMode = ssPreview) then
begin
NewFormSaver(FormSaver, nil);

if (SSMode = ssPreview) then
begin
ParentHandle := Str2Int(ParamStr(2));
GetWindowRect(ParentHandle, ParentRect);

SetWindowLong(FormSaver.Form.Handle, GWL_STYLE, WS_CHILD or WS_VISIBLE);
SetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE,
GetWindowLong(FormSaver.Form.Handle, GWL_EXSTYLE) and not WS_EX_APPWINDOW or WS_EX_TOOLWINDOW);

SetParent(FormSaver.Form.Handle, ParentHandle);

// FormSaver.Form.Left := 0;
// FormSaver.Form.Top := 0;
// FormSaver.Form.Width := ParentRect.Right - ParentRect.Left;
// FormSaver.Form.Height := ParentRect.Bottom - ParentRect.Top;
end;

Run(FormSaver.Form);
end;


Это начинает работать, то есть моя форма показывается в окошке предварительного просмотра, но после этого прекращается переключение по сисмемным табам (на Фон, Оформление и т.д).


mdw   (2003-01-09 11:02:00) [16]

А какие проблемы? На тему написания хранителей экрана документации и примеров в сети полно. А если проблемы с KOL - поконкретнеее. Хотя проблем быть не должно. Покрайней мере с использованием VCL хранителей экрана писать геморойней.


Наверх

Титульная страница Поиск, карта сайта Написать письмо