Господа, помогите отловить сообщение...
От: Kviz  
Дата: 13.08.03 12:22
Оценка:
Господа, пожалуйста помогите. Пытаюсь написать программу-заставку(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;

Заранее благодарен.
Re: Господа, помогите отловить сообщение...
От: Santa  
Дата: 14.08.03 01:46
Оценка:
Здравствуйте, Kviz, Вы писали:

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


.....

K>Заранее благодарен.


ST> Попробуй оформить рисование не в процедуре, а в потоке и повесь обычный обработчик на WM_DESTROY. В этом обработчике делай рисовальному потоку Terminate. Только не забудь в потоке контроллировать свойство Terminated.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.