Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.05.2013, 13:33
Chrumov Chrumov вне форума
Прохожий
 
Регистрация: 10.05.2013
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Console Application в Delphi

В общем возник вопрос, как при закрытии программы выполнить какое либо действие? (в Console Application)

Последний раз редактировалось Chrumov, 10.05.2013 в 13:38.
Ответить с цитированием
  #2  
Старый 10.05.2013, 15:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Отлавливать CTRL_CLOSE_EVENT

Код:
function ConProc(CtrlType : DWord) : Bool; stdcall; far;
var
S: string;
begin
case CtrlType of
   CTRL_C_EVENT: S := 'CTRL_C_EVENT';
   CTRL_BREAK_EVENT: S := 'CTRL_BREAK_EVENT';
   CTRL_CLOSE_EVENT: S := 'CTRL_CLOSE_EVENT';
   CTRL_LOGOFF_EVENT: S := 'CTRL_LOGOFF_EVENT';
   CTRL_SHUTDOWN_EVENT: S := 'CTRL_SHUTDOWN_EVENT';
   else
     S := 'UNKNOWN_EVENT';
end;

CTRL_CLOSE_EVENT - Пользователь закрывает консоль
CTRL_LOGOFF_EVENT - Пользователь завершает сеанс работы (log off)
CTRL_SHUTDOWN_EVENT - Пользователь выключает систему (shut down)
Ответить с цитированием
  #3  
Старый 10.05.2013, 16:35
Chrumov Chrumov вне форума
Прохожий
 
Регистрация: 10.05.2013
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А как это реализовать? Ставить таймер чтобы он проверял эти сообщения?
Ответить с цитированием
  #4  
Старый 11.05.2013, 18:05
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
program Console;
{by Alex G. Fedorov, May-July, 1997 alexfedorov@geocities.com}

{$APPTYPE CONSOLE}

uses
Windows, SysUtils;

const

// Некоторые стандартные цвета
YellowOnBlue = FOREGROUND_GREEN or FOREGROUND_RED or
FOREGROUND_INTENSITY or BACKGROUND_BLUE;

WhiteOnBlue = FOREGROUND_BLUE or FOREGROUND_GREEN or
FOREGROUND_RED or FOREGROUND_INTENSITY or BACKGROUND_BLUE;
 
RedOnWhite = FOREGROUND_RED or FOREGROUND_INTENSITY or
BACKGROUND_RED or BACKGROUND_GREEN or BACKGROUND_BLUE or BACKGROUND_INTENSITY;

WhiteOnRed = BACKGROUND_RED or BACKGROUND_INTENSITY or
FOREGROUND_RED or FOREGROUND_GREEN or FOREGROUND_BLUE or FOREGROUND_INTENSITY;

var
 ConHandle: THandle; // Дескриптор консольного окна
 Coord: TCoord; // Для хранения/установки позиции экрана 
 MaxX, MaxY: Word; // Для хранения максимальных размеров окна
 CCI: TConsoleCursorInfo;
 NOAW: LongInt; // Для хранения результатов некоторых функций

// Получение дескриптора для консольного ввода
function GetConInputHandle: THandle;
begin
 Result:= GetStdHandle(STD_INPUT_HANDLE)
end;

// Получение дескриптора для консольного вывода
function GetConOutputHandle: THandle;
begin
 Result:= GetStdHandle(STD_OUTPUT_HANDLE)
end;

// Установка курсора в координаты X, Y
procedure GotoXY(X, Y: Word);
begin
 Coord.X:= X;
 Coord.Y:= Y;
 SetConsoleCursorPosition(ConHandle, Coord);
end;

// Очистка экрана - заполнение его пробелами
procedure Cls;
begin
 Coord.X:= 0;
 Coord.Y:= 0;
 FillConsoleOutputCharacter(ConHandle, ' ', MaxX * MaxY, Coord, NOAW);
 GotoXY(0, 0);
end;

// Показываем/Скрываем курсор
procedure ShowCursor(Show : Bool);
begin
 CCI.bVisible:= Show;
 SetConsoleCursorInfo(ConHandle, CCI);
end;

// Инициализация глобальных переменных
procedure Init;
begin
// Получаем дескриптор вывода (output)
 ConHandle:= GetConOutputHandle;

// Получаем максимальные размеры окна
 Coord:= GetLargestConsoleWindowSize(ConHandle);
 MaxX:= Coord.X;
 MaxY:= Coord.Y;
end;

// рисуем строку статуса ("status line")
procedure StatusLine(S : string);
begin
 Coord.X:= 0; 
 Coord.Y:= 0;
 WriteConsoleOutputCharacter(ConHandle, PChar(S), Length(S)+1, Coord, NOAW);
 FillConsoleOutputAttribute (ConHandle, WhiteOnRed, Length(S), Coord, NOAW);
end;

// Консольный обработчик событий
function ConProc(CtrlType : DWord) : Bool; stdcall; far;
var
 S: string;
begin
 case CtrlType of
   CTRL_C_EVENT: S := 'CTRL_C_EVENT';
   CTRL_BREAK_EVENT: S := 'CTRL_BREAK_EVENT';
   CTRL_CLOSE_EVENT: S := 'CTRL_CLOSE_EVENT';
   CTRL_LOGOFF_EVENT: S := 'CTRL_LOGOFF_EVENT';
   CTRL_SHUTDOWN_EVENT: S := 'CTRL_SHUTDOWN_EVENT';
   else
     S := 'UNKNOWN_EVENT';
 end; {case}

 MessageBox(0, PChar(S + ' detected'), 'Win32 Console', MB_OK);
 Result:= true;
end;

{
Основная программа - показывает использование некоторых подпрограмм
а так же некоторых функций консольного API
}
var
 R: TSmallRect;
 Color: Word;
 OSVer: TOSVersionInfo;
 IBuff: TInputRecord;
 IEvent: DWord;
 Continue: Bool;

begin

// Инициализация глобальных переменных
 Init;

// Расположение окна на экране
 with R do
  begin
   Left:= 10;
   Top:= 10;
   Right:= 40;
   Bottom:= 40;
 end;

 SetConsoleWindowInfo(ConHandle, False, R);

// Устанавливаем обработчик событий
 SetConsoleCtrlHandler(@ConProc, True);

// Проверяем обработчик событий
 GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);

// Изменяем заголовок окна
 SetConsoleTitle('Console Demo');

// Прячем курсор
 ShowCursor(False);
 Coord.X:= 0; 
 Coord.Y:= 0;

// Устанавливаем белый текст на синем фоне
 Color:= WhiteOnBlue;
 FillConsoleOutputAttribute(ConHandle, Color, MaxX * MaxY, Coord, NOAW);
// Console Code Page API is not supported under Win95 - only GetConsoleCP
 Writeln('Console Code Page = ', GetConsoleCP);
 Writeln('Max X=', MaxX,' Max Y=', MaxY);
 Readln; // ожидаем ввода пользователя
 Cls; // очищаем экран
 ShowCursor(True); // показываем курсор

// Use some Win32API stuff
 OSVer.dwOSVersionInfoSize:= SizeOf(TOSVersionInfo);
 GetVersionEx(OSVer);

 with OSVer do
   begin
    Writeln('dwMajorVersion = ', dwMajorVersion);
    Writeln('dwMinorVersion = ', dwMinorVersion);
    Writeln('dwBuildNumber = ', dwBuildNumber);
    Writeln('dwPlatformID = ', dwPlatformID);
   end;

 // ожидаем ввода пользователя
 Readln;

// Удаляем обработчик событий
 SetConsoleCtrlHandler(@ConProc, False);
 Cls;

// "Цикл обработки сообщений"
 Continue:= true;

 while Continue do
   begin
    ReadConsoleInput(GetConInputHandle, IBuff, 1, IEvent);
    case IBuff.EventType of
     KEY_EVENT :
       begin
         // Проверяем клавишу ESC и завершаем программу
         if ((IBuff.KeyEvent.bKeyDown = True) and
         (IBuff.KeyEvent.wVirtualKeyCode = VK_ESCAPE)) then
           Continue:= false;
       end;
     _MOUSE_EVENT :
       begin
         with IBuff.MouseEvent.dwMousePosition do
           StatusLine(Format('%d, %d', [X, Y]));
       end;
   end;
 end {While}
end.
// Drkb: 02179
Ответить с цитированием
  #5  
Старый 12.05.2013, 01:37
Chrumov Chrumov вне форума
Прохожий
 
Регистрация: 10.05.2013
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо разобрался)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025