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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2008, 09:17   #1
ERASERROR
Форумчанин
 
Регистрация: 15.01.2008
Сообщений: 117
По умолчанию приложение без формы, событие при завершении

Мое приложение не имеет формы, но постоянно висит в системе, мне нужно что бы при завершении моего процесса или при выключении оси выполнялось одно действие, как реализовать?
ERASERROR вне форума Ответить с цитированием
Старый 22.02.2008, 09:23   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Выполнить "одно действие" перед
Код:
end.

А что такое здесь "приложение без формы"? Служба? Нет?
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 10:04   #3
ERASERROR
Форумчанин
 
Регистрация: 15.01.2008
Сообщений: 117
По умолчанию

Нет, стер форму, бесконечный цикл так и висит в системе, но когда ось выключается надо одно действие сделать
ERASERROR вне форума Ответить с цитированием
Старый 22.02.2008, 10:52   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от ERASERROR Посмотреть сообщение
Нет, стер форму, бесконечный цикл так и висит в системе, но когда ось выключается надо одно действие сделать
Очень странное решение. Не проще скрыть форму и делать всё как обычно?
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 11:10   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нет, стер форму, бесконечный цикл так и висит в системе, но когда ось выключается надо одно действие сделать
Вообще то прислушайся к Бьену, он днло говорит, но уж еси без формы хочеш то ставь хук на WM_QUERYENDSESSION.

(Но лучше прислушайся к Бьену.)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2008, 11:42   #6
ERASERROR
Форумчанин
 
Регистрация: 15.01.2008
Сообщений: 117
По умолчанию

С формой мое приложение весит более трехсот килобайт, а без около восьмидесяти.кстати как станвить hook?
ERASERROR вне форума Ответить с цитированием
Старый 22.02.2008, 11:49   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от ERASERROR Посмотреть сообщение
С формой мое приложение весит более трехсот килобайт, а без около восьмидесяти.кстати как станвить hook?
А через CreateWindow окно сделать если?
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 13:03   #8
ERASERROR
Форумчанин
 
Регистрация: 15.01.2008
Сообщений: 117
По умолчанию

Мне не нужно окно, зачем создавать то чем не пользуешься?просто моя прога должна мало весить, тем более что она выполняет очень простые вещи.так как поставить hook?
ERASERROR вне форума Ответить с цитированием
Старый 22.02.2008, 13:26   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

ERASERROR, Хук ставить дольше, чем написать что-то вроде этого: (я мог тут где-нибудь напутать в переводе на паскаль без компиляции) Не знаю, как сейчас, но во времена 4-5 дельфей такие вещи весили килобайт двадцать.

Код:
var 
	wc : WNDCLASS;

function WndProc(hWnd :HWND; message, wParam, lParam : carinal) : cardinal;
begin
	result := 0;
	if(message = WM_DESTROY) then PostQuitMessage(0);
	else result := DefWindowProc(hWnd, message, wParam, lParam);
end;
	
begin
	wc.cbSize = sizeof(WNDCLASS); 
	wc.style			:= 0;
	wc.lpfnWndProc		:= @WndProc;
	wc.cbClsExtra		:= 0;
	wc.cbWndExtra		:= 0;
	wc.hInstance		:= GetModuleHandle(0);
	wc.hIcon			:= nil;
	wc.hCursor			:= nil;
	wc.hbrBackground	:= nil;
	wc.lpszMenuName		:= '';
	wc.lpszClassName	:= '_1234567890_';

	RegisterClass(@wc);

	CreateWindow('_1234567890_', '', 0, -32768,-32768, 1, 1, nil, nil, wc.hInstance, nil);

	while (GetMessage(@msg, 0, 0, 0) <> 0) do begin
		TranslateMessage(@msg);
		DispatchMessage(@msg);
	end;
	///////////////////////////////
// Вот тут всё и произойдет.
	Beep(2000,1000);
	///////////////////////////////
end.

Последний раз редактировалось B_N; 22.02.2008 в 13:40. Причина: Нолик в CreateWindow пропустил...
B_N вне форума Ответить с цитированием
Старый 22.02.2008, 13:59   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вот тут всё и произойдет.
Ой-ли?
А если я из диспетчера турну прогу, что дойдет до этой строки?
Помоему Диспетчер просто выдавит из памяти процесс без всяких там предупреждений и давания возможности правильно завершиться.

Как вариант: в WndProc обрабатывать WM_DESTROY и WM_QUERYENDSESSION

Кстати такой пример вот:
Код:
{
  Данный код был спроектирован в среде APIx - Visual WinAPI 2
  Copyright (c) PiddleSoft 2004-2006
  http://piddlesoft.narod.ru
  piddlesoft@mail.ru

  Дата генерации листинга - 22.02.2008 13:01:42
}

program APIx_Project8;

uses
  windows,
  messages,
  commctrl;

//Используемые модули

// Иконка


var
  WinClass : TWndClass; //переменная класса TWndClass для создания главного окна
  hInst : HWND; //хандлер приложения
  Handle : HWND; //локальный хандлер
  Msg : TMSG; //сообщение

procedure ShutDown; //процедура завершения программы
begin     MessageBox(GetForegroundWindow,'','',0);
  UnRegisterClass('TAPIxForm', hInst); //удаление окна
  ExitProcess(hInst); //закрытие программы
end;

function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщений
begin
  Result := DefWindowProc(hwnd, msg, wparam, lparam);
  case Msg of

  WM_DESTROY: ShutDown;
  end;
end;

begin
hInst := GetModuleHandle(nil);
  with WinClass do
  begin
   Style := CS_PARENTDC; //стиль класса главного окна
   hIcon := LoadIcon(hInst, MAKEINTRESOURCE('APIXICON')); //иконка программы
   lpfnWndProc := @WindowProc; //назначение обработчика сообщений
   hInstance := hInst;
   hbrBackground := COLOR_BTNFACE + 1; //цвет окна
   lpszClassName := 'TAPIxForm'; //класс окна
   hCursor := LoadCursor(0, IDC_ARROW); //активный курсор
  end;
InitCommonControls;
RegisterClass(WinClass); //регистрация класса в системе

// Создание главного окна программы
Handle := CreateWindowEx(0, 'TAPIxForm', 'Форма1',
WS_OVERLAPPEDWINDOW or
WS_VISIBLE or WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU,
219, 116, 550, 366,
0, 0,
hInst, nil);

  // Цикл сбора сообщений
  while(GetMessage(Msg, 0, 0, 0)) do
  begin
    TranslateMessage(Msg); //прием сообщений
    DispatchMessage(Msg); //удаление сообщений из очереди
  end;
  MessageBox(GetForegroundWindow,'','',0);
  end.
Всего то 9 кил будет весить, а без окна кила 3-4 так что одно окошко погоды не ухудшит.
I'm learning to live...

Последний раз редактировалось Stilet; 22.02.2008 в 14:06.
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Событие terminadoor Общие вопросы Delphi 13 17.07.2008 09:25
какое событие отвечает за получени/потерю фокуса у формы? Paul Hindenburg Общие вопросы Delphi 4 10.06.2008 14:47
Какое событие происходит при переходе из оконного режима формы в полноэкраный (развернутый)? Luciferium Общие вопросы Delphi 9 09.03.2008 17:36
Событие OnShow формы Antoha Общие вопросы Delphi 4 12.02.2008 21:13
Приложение без формы Wiggle Общие вопросы Delphi 12 18.04.2007 20:20