Господа, пожалуйста помогите. Пытаюсь написать программу-заставку(ScreenServer). Я использую VCL, поэтому прошу не удивляться Form1. И не приводить ссылок и примеров на статьи по написанию заставок(т.к. там события отлавливаются по другому приципу, по крайне мере эти статьи мне не помогли). Проблема в том что я не могу реализовать выход из программы в режиме просмотра. Т.е. когда ScreenServer запускается с параметром “-p”, моя программа получает хэндл окна просмотра, потом дискриптор окна просмотра и рисует в нём, но если пользователь выбрал другую заставку или вышел из опций, моя программа остаётся висеть в памяти, тщетно пытаясь рисовать. В конференциях говориться что заставке посылается сообщение WM_DESTROY, которое нужно отловить(и завершить программу), но это у меня не получается.
Пытаюсь делать так:
procedure TForm1.RunPreview; {Запуск программы в режиме просмотра}
Var
R : TRect;
PreviewWindow : hWnd;
Msg : TMsg;
Dummy : DWord;
B:TCanvas;
Begin
form1.Hide;
{Нч. Получаю хэндл, контекст и создаю канву}
If ParamCount > 1 Then Val(ParamStr(2), PreviewWindow, Dummy)
Else PreviewWindow := GetForegroundWindow;
GetWindowRect(PreviewWindow, R);
b:=TCanvas.Create;
b.Handle:=GetDC(PreviewWindow);
b.Pen.Color:=$009900;
b.Brush.Color:=$009900;
{Кц. Получаю хэндл, контекст и создаю канву}
{***Тут-то начинаются проблемы***}
While GetMessage(Msg, 0, 0, 0) Do
Begin
{Пытаюсь отловить сообщение вот так}
if msg.message=WM_DESTROY then begin
{Сдесь должен распологаться блок выхода из программы}
halt(1);
end;
{Нч. Тут рисую

}
b.Pen.Color:=b.Pen.Color+100;
b.Rectangle(0,0,10,10);
{Кц. Тут рисую

}
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
{*** Тут заканчивается цикл, но не заканчиваются проблемы

****}
End;
Заранее благодарен.
Здравствуйте, Kviz, Вы писали:
K>Господа, пожалуйста помогите. Пытаюсь написать программу-заставку(ScreenServer). Я использую VCL, поэтому прошу не удивляться Form1. И не приводить ссылок и примеров на статьи по написанию заставок(т.к. там события отлавливаются по другому приципу, по крайне мере эти статьи мне не помогли). Проблема в том что я не могу реализовать выход из программы в режиме просмотра. Т.е. когда ScreenServer запускается с параметром “-p”, моя программа получает хэндл окна просмотра, потом дискриптор окна просмотра и рисует в нём, но если пользователь выбрал другую заставку или вышел из опций, моя программа остаётся висеть в памяти, тщетно пытаясь рисовать. В конференциях говориться что заставке посылается сообщение WM_DESTROY, которое нужно отловить(и завершить программу), но это у меня не получается.
.....
K>Заранее благодарен.
ST> Попробуй оформить рисование не в процедуре, а в потоке и повесь обычный обработчик на WM_DESTROY. В этом обработчике делай рисовальному потоку Terminate. Только не забудь в потоке контроллировать свойство Terminated.