Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2009, 20:01   #1
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию Как отловить сообщение WM_DESTROY правильно?

Здравствуйте, уважаемые!
Проблема такая: есть приложение без формы. Нужно отловить системное сообщение о убийстве процесса и исполнить нужный код перед убийством...

Подскажите, как это правильнее сделать?
Заранее благодарен!
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 06.11.2009, 20:06   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Вы не делали обработчик событий (в смысле в данном проекте)?
Если делали, то припишите к нужным событиям WM_DESTROY.
Если пишете на API - только дописать в Case
Если нет - попробуйте хук
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.11.2009, 20:16   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

про хук можно подробнее (желательно с простейшим примером)... Библиотека в проекте есть, в принципе хук туда можно запихать, не помешает
UPD:
я правильно считаю, что хук, который WM_DESTROY отлавливает так устанавливается?
Код:
SetWindowsHookEx( WH_SHELL, @HookProc, Hinstance, 0 );
только я вот не знаю как правильно обработать этот хук в библиотеке и отослать-принять в основном потоке... научите, если не трудно)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 06.11.2009 в 20:22.
Johnson вне форума Ответить с цитированием
Старый 06.11.2009, 20:36   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Вот здесь я ставил хук на клик мыши (Чтобы посмотреть, что делает прога, поставьте разрешение экрана 1152 * 864 и запустите её)
Вложения
Тип файла: rar SpiderOn-Line.rar (187.6 Кб, 20 просмотров)
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 06.11.2009, 20:43   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Покурил тут инет немного... вот такой обработчик грамотно описан для обработки дестроя?
Код:
function WindowProc (Hwn,msg,wpr,lpr: longint): longint; stdcall;
begin
result:=defwindowproc(hwn,msg,wpr,lpr);
	if msg=wm_destroy then begin
		{Что-то}
	end;
end;

begin
instance :=GetModuleHandle(nil);
WindowClass.style:=CS_HRedraw or CS_VRedraw;
WindowClass.Lpfnwndproc:=@windowproc;
WindowClass.Hinstance:=Instance;
WindowClass.HbrBackground:= color_btnface;
WindowClass.LpszClassName:='DX';
WindowClass.Hcursor:=LoadCursor(0,IDC_ARROW);
RegisterClass (WindowClass);
//Цикл обработки сообщений
	while (GetMessage(msg, 0, 0, 0)) do begin
		translatemessage(msg);
		dispatchmessage (msg);
	end;
end.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 06.11.2009, 20:49   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

дык...
Код:
function WindowProc(hnd, wmsg, wparam, lparam: integer): integer; stdcall;
begin
 case wmsg of

  WM_DESTROY: begin
                        //ваши дii
                        ...
                        //
                        PostQuitMessage(0)               
                       end;
  else Result:= DefWindowProc(hnd, wmsg, wparam, lparam)
 end
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 06.11.2009 в 20:51.
raxp вне форума Ответить с цитированием
Старый 06.11.2009, 20:58   #7
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Так-с... что-то я не так делаю...
Код:
function WindowProc(hnd, wmsg, wparam, lparam: integer): integer; stdcall;
begin
 case wmsg of
  WM_DESTROY: begin
              //что-то
              PostQuitMessage(0)
              end;
  else Result:= DefWindowProc(hnd, wmsg, wparam, lparam)
 end;
end;

begin
instance :=GetModuleHandle(nil);
WindowClass.style:=CS_HRedraw or CS_VRedraw;
WindowClass.Lpfnwndproc:=@windowproc;
WindowClass.Hinstance:=Instance;
WindowClass.HbrBackground:= color_btnface;
WindowClass.LpszClassName:='DX';
WindowClass.Hcursor:=LoadCursor(0,IDC_ARROW);
RegisterClass (WindowClass);

//Сказали, что без окна прога не отловит дестрой, надо создавать:
Handle:=CreateWindowEx (0,'DX','',WS_POPUP, 1,1,
GetSystemMetrics (SM_CXSCREEN),
GetSystemMetrics (SM_CYSCREEN),0,0,instance, nil);
UpdateWindow (Handle);

//Цикл обработки сообщений
	while (GetMessage(msg, 0, 0, 0)) do begin
		translatemessage(msg);
		dispatchmessage (msg);
	end;
end.
ругается на RegisterClass (WindowClass); вот так:
Цитата:
[DCC Error] prog.dpr(39): E2010 Incompatible types: 'TPersistentClass' and 'tagWNDCLASSA'
Переменные обьявлял как в примере:
Цитата:
var
Instance: HWnd;
WindowClass: TWndClass;
Handle: HWnd;
msg: TMsg;
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 06.11.2009, 21:05   #8
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Извиняюсь...
Код:
Windows.RegisterClass (WindowClass);
спасло...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 07.11.2009, 08:46   #9
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Извиниюсь, что вопрос не по теме слегка... Но всё же: как проверить, отцепился ли хук после получения и обработки дестроя?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 07.11.2009, 10:32   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

покажите где вы его ставите
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отловить событие нажатия клавиши Esc? dsapa Microsoft Office Excel 14 03.12.2016 14:27
Как отловить события которое вызывается при розворачивании подменющек (PopupMenu) DarkEvil Общие вопросы Delphi 9 09.05.2009 18:17
Как отловить значение из таблицы? mik Microsoft Office Excel 5 27.10.2008 16:34
Как отловить ошибку в своей проге ??? Crazyman Win Api 8 02.09.2008 09:24
Как отловить имена таблиц? mik Microsoft Office Excel 1 18.11.2007 17:02