Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отследить завершение работы в API приложении? 
:(
    Опции темы
Mazenrat
Дата 5.9.2002, 03:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет.

Вообщем приложение не имеет VCL компонентов. Нужно отследить момент завершения работы приложения. Точнее нужно отследить момент завершения Windows, и, если пользователь собирается выключить компьютер - программа должна вывести диалог запроса. Если пользователь нажимает кнопку YES - разрешаем выключение, если NO - отменяем. С помощью VCL компонентов это делается элементарно:

Код
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//Спрашиваем пользователя, если инициировано завершение работы.
if MessageDlg('Вы уверены?', mtConfirmation, mbYesNoCancel, 0) = mrYes
 then CanClose := true   //Разрешаем завершение работы.
 else CanClose := false; //Nе разрешаем завершение работы.
end;


Вопрос в том как это сделать в API приложении? Посоветовали мне на другом форуме WM_QUERYENDSESSION. Но при завершении работы Windows ничего не происходит. Windows всё преспокойненько закрывает. А мне нужно НЕ дать завершить работу Windows.

Код
if msg.message = WM_QUERYENDSESSION then  
begin
 //Как остановить Виндоус?
end;

  Вверх
Mazenrat
Дата 5.9.2002, 19:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Неужели здесь никто не знает?
  Вверх
December
Дата 5.9.2002, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Я когда-то тоже этим занимался, но WM_QUERYENDSESSION поймать так и не смог. а вообще достаточно всего лишь возвращать то ли ноль, то ли не ноль, и винда вырубаться не будет.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Seregy
Дата 5.9.2002, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 30.7.2002

Репутация: нет
Всего: нет



-MSDN---
WM_QUERYENDSESSION
The WM_QUERYENDSESSION message is sent when the user chooses to end the session or when an application calls the ExitWindows function. If any application returns zero, the session is not ended. The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

After processing this message, the system sends the WM_ENDSESSION message with the wParam parameter set to the results of the WM_QUERYENDSESSION message.

A window receives this message through its WindowProc function.

LRESULT CALLBACK WindowProc(
 HWND hwnd,          // handle to window
 WM_QUERYENDSESSION, // the message to send
 WPARAM wParam,      // not used
 LPARAM lParam       // logoff option
);
----------------
еще вопросы есть?

Я правда не знаю, как конкретно ты ловишь сообщения в Delphi, но тебе в ответ на него нужно 0 вернуть, и все ок.
PM MAIL   Вверх
Mazenrat
Дата 8.9.2002, 22:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Добрый день.

Не знаю что делать. Никак не ловиться WM_QUERYENDSESSION. Помогите!

Код
function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer;
stdcall; export;
begin
Result := 0;
if uMsg = TaskBarCreated then
 TaskBarAddIcon(hWnd, ICON_ID, LoadIcon(hInstance, 'MAINICON'), WM_TASKBAR, Hint);
case uMsg of
 WM_QUERYENDSESSION:  begin
   if messageBox(0,'Выйти из Windows?','Выход',MB_YESNO)=ID_NO then
    Result := integer(FALSE)
    else Result := DefWindowProc(hWnd, uMsg, wParam, lParam); end;
  WM_COMMAND: case wParam of
               ID_CLOSE:  PostMessage(hWnd, WM_DESTROY, 0, 0);
               ID_OPENCD: begin {-------} end; end;
  WM_TASKBAR: case wParam of
               ICON_ID: case lParam of
               WM_RBUTTONDOWN: PopupMenu(hWnd); end; end;
  WM_DESTROY: begin PostQuitMessage(0); Exit; end;
 end;
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;

  Вверх
rhf
Дата 9.9.2002, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 13.8.2002

Репутация: нет
Всего: нет



PM MAIL   Вверх
Fantasist
Дата 9.9.2002, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Код

function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer;
stdcall; export;
begin
Result := 0;
if uMsg = TaskBarCreated then
TaskBarAddIcon(hWnd, ICON_ID, LoadIcon(hInstance, 'MAINICON'), WM_TASKBAR, Hint);
case uMsg of
WM_QUERYENDSESSION:  begin
  if messageBox(0,'Выйти из Windows?','Выход',MB_YESNO)=ID_NO then
   Result := integer(FALSE)
   else Result := DefWindowProc(hWnd, uMsg, wParam, lParam); end;
 WM_COMMAND: case wParam of
              ID_CLOSE:  PostMessage(hWnd, WM_DESTROY, 0, 0);
              ID_OPENCD: begin {-------} end; end;
 WM_TASKBAR: case wParam of
              ICON_ID: case lParam of
              WM_RBUTTONDOWN: PopupMenu(hWnd); end; end;
 WM_DESTROY: begin PostQuitMessage(0); Exit; end;
end;
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;


Ну а другие-то сообщения этот код ловит? А зачем export?


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 9.9.2002, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Стало интересно, попробовал.
Вот код. Полностью работает.
Код

program kvd;

uses
 Windows,
 Messages;

var
 hWnd: THandle;
 WndClass: TWndClass;
 Msg: TMsg;

function WindowProc(hWnd: THandle; uMsg, wParam, lParam: Integer): Integer;
stdcall;
begin
Result:=0;
case uMsg of
 WM_QUERYENDSESSION:
      Result := integer(false);
  WM_DESTROY:
     PostQuitMessage(0);
else
  Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
end;
end;

begin
FillChar(WndClass, SizeOf(WndClass), 0);
 with WndClass do begin
  hInstance      := SysInit.hInstance;
  lpszClassName  := 'dd';
  lpfnWndProc    := @WindowProc;
 end;
  RegisterClass(WndClass);
 hWnd := CreateWindow('dd', '', 0, 0, 0, 0, 0, 0, 0, hInstance, NIL);
 if hWnd = 0 then
  Exit;
 ShowWindow(hWnd, SW_HIDE);
 while GetMessage(Msg, 0, 0, 0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end;
end.


Ничего сложного. Просто читайте SDK.  :)


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.