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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2011, 07:56   #1
g-davicelli
Пользователь
 
Аватар для g-davicelli
 
Регистрация: 05.02.2011
Сообщений: 11
Сообщение Не получается проверить выполнение функции

Хай! Есть функция отлавливающая сообщение о завершении работы окна. Но я не нему праиельно её проверить. Кто знает в чём тут проблема...
Код:
function WindowsMessageQueryEndSession(var PostMessage: TMessage): Boolean;
begin
  Result := False;
  if PostMessage.Msg = WM_QUERYENDSESSION then
  begin
    Windows.Beep(1000, 100);
    Exit;
  end;
  Result := True;
end;
Проверяю собственно вот так...
Код:
if not WindowsMessageQueryEndSession(0, WM_QUERYENDSESSION, 0, 0) then
Но не выходит, что сделать что бы всё работало нормально?

Извините за беспокойство, только что сам разобрался в чём проблема. Тему оставлю может всё же кто наилучшее решение предложит...

Последний раз редактировалось g-davicelli; 13.10.2011 в 08:15. Причина: Эврика
g-davicelli вне форума Ответить с цитированием
Старый 13.10.2011, 08:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Интересно... Обьявлен один параметр а передается четыре... И компиль это пропустил?
Цитата:
о завершении работы окна.
Может не окна а сеанса? Если я помню верно это сообщение поступает при выключении компа.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.10.2011, 10:24   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Мдя.... ТС ну вы даёте....
Цикл сообщений постоянный, а ваша "функция" никоим образом никогда работать вообще не будет. И на этот как минимум 2 основных причины:

1. Цепочка сообщений движется как конвер. По этому ваш обработчик никогда не отпределит WM_QUERTYENDSESSION т.к. на тот момент в очереди будет другое сообщение, и это причина того, что нужно ставить обработчик на это сообщение. для программы.

2. Данный код просто заставит повиснуть ВАШУ программу, и не корректно завершит другие программы в системе т.к. вы не передаёте сообщение дальше по цепочке т.е. на вашей программе извещение от системы о том, что "пришёл абзац" прекратиться и другие программы не узнают о завершении и не будут к нему готовы.


Надо вот как:
Заведите себе глобальную переменную IsWindowsEndSession типа boolean, далее
в шапке модуля обьявите процедуру:

Код:
procedure WindowsEndSessionHook(var msg: TMessage); message WM_QUERYENDSESSION;
далее код:
Код:
procedure TMainForm.WindowsEndSessionHook(var msg: TMessage);
begin
  if msg.WParam = WM_QUERYENDSESSION then
  begin
        IsWindowsEndSession := True;
  end;
  inherited; //Пускаем сообщение дальше по цепочки в системе(на нас оно не зависает).
end;
Вот и все.

Stilet, вполне возможно. Есть ли разница в том что, если указть на сам TMessage или указать его содержимое? Ведь компилятор в результате всеравно указывает содержимое...
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклическое выполнение функции coNsept Общие вопросы C/C++ 1 04.10.2011 11:59
Не получается правильное выполнение проги (рекурсия) Driver_09 Помощь студентам 0 23.12.2009 19:55
Прервать выполнение функции? Как? TwiX Общие вопросы Delphi 9 28.09.2009 16:36
Мгновенное выполнение функции systemmind Microsoft Office Excel 4 07.02.2009 00:32
Выполнение функции nikleb JavaScript, Ajax 7 10.08.2008 01:49