Советы по Delphi. Версия 1.4.3 от 1.1.2001 - [7]

Шрифт
Интервал

Следующий код демонстрирует как можно воспользоваться данным событием.

Демонстрационный код

>procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

>begin

> {Спрашиваем пользователя, если инициировано завершение работы.}

if MessageDlg('Вы уверены?', mtConfirmation, mbYesNoCancel, 0) = mrYes then CanClose := true    {Разрешаем завершение работы.}

else CanClose := false; {Не разрешаем завершение работы.}

>end;

Как консольное приложение может узнать, что Винды завершаются?

Nomadic рекомендует следующий код:

Все процессы получают сигналы CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT и CTRL_SHUTDOWN_EVENT. А делается это (грубо говоря :) так:

>BOOL Ctrl_Handler(DWORD Ctrl) {

> if ((Ctrl == CTRL_SHUTDOWN_EVENT) || (Ctrl == CTRL_LOGOFF_EVENT)) {

>  // Вау! Юзер обламывает!

> } else {

>  // Тут что-от другое можно творить. А можно и не творить :-)

> }

> return TRUE;

>}


>function Ctrl_Handler(Ctrl: Longint): LongBool;

>begin

> if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then begin

>// Вау, вау

> end

> else begin

>// Am I creator?

end;

> Result := true;

>end;

А где-то в программе:

>SetConsoleCtrlHandler(Ctrl_Handler, TRUE);

Таких обработчиков можно навесить кучу. Если при обработке какого-то из сообщений обработчик возвращает FALSE, то вызывается следующий обработчик. Можно настроить таких этажерок, что ого-го :-)))

Короче, смотри описание SetConsoleCtrlHandler — там всё есть.

Как корректно перехватить сигнал выгрузки операционной системы, если в моей программе нет окна?

Nomadic рекомендует следующий способ:

Используй GetMessage(), в качестве HWND окна пиши NULL (на Паскале — 0). Если в очереди сообщений следующее — WM_QUIT, то эта функция фозвращает FALSE. Если ты пишешь программу для Win32, то запихни это в отдельный поток, организующий выход из программы.

Постепенное умирание

The_Sprite пишет:

Вопрос: А как реализовать в одном компоненте такие функции как выключение компьютера, перезагрузка, завершение сеанса работы пользователя, Eject CD, выключение питания монитора и т.д.? Ответ: предлагаем посмотреть следующий пример…

Совместимость: все версии Delphi

Пример:

>procedure TForm1.Button1Click(Sender: TObject);

>begin

> PowerControl1.Action:=actCDEject;// Или...

> actLogOFF, actShutDown...

> PowerControl1.Execute;

>end

Component Code:

>unit

> PowerControl;

>interface


>uses WinTypes, WinProcs, Messages, SysUtils, Classes, Controls,Forms, Graphics,MMSystem;

>type

>TAction =(actLogOFF,actShutDown,actReBoot,actForce,actPowerOFF,

> actForceIfHung,actMonitorOFF,actMonitorON,actCDEject,actCDUnEject);


>type TPowerControl = class(TComponent)

>private

> FAction : TAction;

> procedure SetAction(Value : TAction); protected

>public

> function Execute :Boolean;

>published

> property Action :TAction read FAction write SetAction;

>end;


>procedure Register;


>implementation


>procedure Register;

>begin

> RegisterComponents('K2',[TPowerControl]);

>end;


>procedure TPowerControl.SetAction(Value : TAction);

>begin

> FAction := Value;

>end;


>function TPowerControl.Execute : Boolean;

>begin

> with (Owner as TForm) do case FAction of

>  actLogOff: ExitWindowsEx(EWX_LOGOFF, 1);

>  actShutDown: ExitWindowsEx(EWX_SHUTDOWN, 1);

>  actReBoot:ExitWindowsEx(EWX_REBOOT, 1);

>  actForce:ExitWindowsEx(EWX_FORCE, 1);

>  actPowerOff:ExitWindowsEx(EWX_POWEROFF, 1);

>  actForceIfHung:ExitWindowsEx(EWX_FORCEIFHUNG, 1);

>  actMonitorOFF:SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

>  actMonitorON: SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

>  actCDEject: mciSendstring('SET CDAUDIO DOOR OPEN WAIT', nil, 0, Handle);

>  actCDUnEject: mciSendstring('SET CDAUDIO DOOR CLOSED WAIT', nil, 0, Handle);

end; {Case}

> Result := True;

>end;


>end.

Разное

Как не допустить запуск второй копии программы VIII

Игорь Пролис рекомендует следующий код:

>{*******************************************************}

>{                                                       }

>{                     HTMLCoolEdit                      }

>{                                                       }

>{           Copyright (c) 1999-2000 PROFOX              }

>{                                                       }

>{*******************************************************}

>unit multinst;


>interface


>uses Forms, Windows, Dialogs, SysUtils;


>const

> MI_NO_ERROR = 0;

> MI_FAIL_SUBCLASS = 1;

> MI_FAIL_CREATE_MUTEX = 2;


>function GetMIError: Integer;

>function InitInstance : Boolean;


>implementation


>uses RegWork, FileWork;


>var

> UniqueAppStr : PChar;

> MessageId: Integer;

> WProc: TFNWndProc = Nil;

> MutHandle: THandle = 0;

> MIError: Integer = 0;


>function GetMIError: Integer;

>begin

> Result := MIError;

>end;


>function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; StdCall;

>begin

> Result := 1;

if Msg = MessageID then begin

>  if IsIconic(Application.Handle) then OpenIcon(Application.Handle)

else SetForegroundWindow(Application.Handle);

>  FileWork.LoadFileName(RegWork.RWGetParamStr1);

end

> else Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);

>end;


>procedure SubClassApplication;

>begin

> WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));

if WProc = Nil then MIError := MIError


Еще от автора Валентин Озеров
Советы по Delphi. Версия 1.0.6

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


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.