![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что за сообщение? [D6, Win95/98, WinXP]
kullibin © (2003-11-19 14:18:00)
Уважаемые мастера, ответьте на вопрос: Что вызавает сообщение WM_QUIT и как его обработать. Стандартно не получилось, моя форма всё равно закрылась, не высветив ShowMessage о получение данного сообщения.
kullibin (2003-11-25 10:15:00) [1]
>DVM
>Смотря чего автор хочет достичь. Если надо сделать полностью >незакрываемое приложение, то это и
>WM_DESTROY и
>WM_CLOSE и
>WM_QUIT и
>WM_SYSCOMMAND + SC_CLOSE
>А есть же еще TerminateProcess. Но это уже другая песня.
А по подробнее про TerminateProcess можно?
>Игорь Шевченко
То есть что бы возобновить прием сообщений нужно перезапускать программу? А как нибудь программно востановить прием можно?
DVM (2003-11-19 18:08:00) [2]
> - когда взведен флажок QS_QUIT и очередь сообщений пустая,
> GetMessage - не останавливается в ожидании следующей команды...
А вот оно что! Это я и хотел узнать.
han_malign (2003-11-19 18:06:00) [3]
> что когда GetMessage() натыкается на WM_QUIT в очереди сообщений
- когда взведен флажок QS_QUIT и очередь сообщений пустая, GetMessage - не останавливается в ожидании следующей команды...
Игорь Шевченко (2003-11-19 18:00:00) [4]
DVM © (19.11.03 17:54)
Это определяется тем, сколько сообщений будет поставлено в очередь после вызова PostQuitMessage. У Рихтера этот момент хорошо описан. Все сообщения очереди выбираются до WM_QUIT. После выбора WM_QUIT дальнейшая работа с очередью, естественно прекращается.
DVM (2003-11-19 17:54:00) [5]
> Он устанавливает флажок QS_QUIT у очереди сообщений потока.
> Если после вызова функции PostQuitMessage потоку будут посланы
> сообщения, то они будут нормально выбраны. Можно проверить
А после того как этот флаг установлен, сколько времени поток еще будет получать сообщения и чем это определяется?
Я раньше думал, что когда GetMessage() натыкается на WM_QUIT в очереди сообщений, то возвращает 0 и цикл выборки сообщений построенный по обычным правилам заканчивается и все.
Игорь Шевченко (2003-11-19 15:54:00) [6]
DVM © (19.11.03 15:44)
Ничего он не убивает. Он устанавливает флажок QS_QUIT у очереди сообщений потока. Если после вызова функции PostQuitMessage потоку будут посланы сообщения, то они будут нормально выбраны. Можно проверить ;)
DVM (2003-11-19 15:50:00) [7]
> default © (19.11.03 15:45) [14]
Смотря чего автор хочет достичь. Если надо сделать полностью незакрываемое приложение, то это и
WM_DESTROY и
WM_CLOSE и
WM_QUIT и
WM_SYSCOMMAND + SC_CLOSE
А есть же еще TerminateProcess. Но это уже другая песня.
default (2003-11-19 15:45:00) [8]
DVM © (19.11.03 15:38) [12]
и что?я знаю это
автору, наверно, надо WM_SYSCOMMAND c SC_CLOSE ловить
DVM (2003-11-19 15:44:00) [9]
> Игорь Шевченко © (19.11.03 15:28) [11]
> DVM © (19.11.03 15:18)
>
>
> > WM_QUIT убивает процесс как бы изнутри.
>
>
> ?????????????????????????????????
Пытаясь сказать красиво я сказал глупость. Наверное лучше так:
WM_QUIT убивает поток как бы "изнутри", т.е. действует также как PostQuitMessage чаще всего в ответ на WM_DESTROY.
DVM (2003-11-19 15:38:00) [10]
> если PostMessage-ом его слать, то да - до оконной процедуры
> не дойдёт, если же SendMessage-ом и поставить свою обработку,
> то приложение так не закроешь
Да не WM_QUIT сам по себе убивает. Когда приходит WM_QUIT то GetMessage возвратить нуль и обычно выполненный цикл сообщений на этом закончится. Надо цикл переделывать.
Игорь Шевченко (2003-11-19 15:28:00) [11]
DVM © (19.11.03 15:18)
> WM_QUIT убивает процесс как бы изнутри.
?????????????????????????????????
default (2003-11-19 15:28:00) [12]
DVM © (19.11.03 14:19) [1]
если PostMessage-ом его слать, то да - до оконной процедуры не дойдёт, если же SendMessage-ом и поставить свою обработку, то приложение так не закроешь
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure WMQuit(var Msg: TMsg); message WM_QUIT;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMQuit(var Msg: TMsg);
begin
Caption := "ghgghgh"
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Handle, WM_QUIT, 0, 0); // не закроется
//PostMessage(Handle, WM_QUIT, 0, 0); // закроется
end;
end.
Внук (2003-11-19 15:22:00) [13]
>>DVM © (19.11.03 15:18) [8]
Несогласный я :) Тем более на API
DVM (2003-11-19 15:18:00) [14]
> Внук
> А если не поможет? Не подскажешь как сделать
Не поможет. От WM_QUIT не спасет. WM_QUIT убивает процесс как бы изнутри.
Если на API, то в цикле сообщений проверять, что пришло WM_QUIT и запускать вторую копию программы. Ибо WM_QUIT это лишь предвестник того, что процесс убивают и неважно дошло оно до программы или нет.
kullibin (2003-11-19 15:14:00) [15]
Внук
В мирных это в каких? И подскажи пожалуйста путь решения, умоляю, очень надо
Внук (2003-11-19 15:09:00) [16]
Есть пути решения... Другое дело, не люблю я незакрывающихся программ. Может, лучше эту энергию в мирных целях использовать?
kullibin (2003-11-19 15:00:00) [17]
DVM
Прога на API хотя лучше для обоих вариантов
Внук
А если не поможет? Не подскажешь как сделать
Внук (2003-11-19 14:41:00) [18]
Да, в оконную процедуру не попадает, потому как это и не совсем сообщение. Может, OnCloseQuery главной формы поможет отцу русской демократии?
DVM (2003-11-19 14:40:00) [19]
А программа на API или VCL?
kullibin (2003-11-19 14:35:00) [20]
И что тогда делать, как его подавить?