Форум: "Система";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
ВнизЧто за сообщение? Найти похожие ветки
← →
kullibin (2003-11-19 14:18) [0]Уважаемые мастера, ответьте на вопрос: Что вызавает сообщение WM_QUIT и как его обработать. Стандартно не получилось, моя форма всё равно закрылась, не высветив ShowMessage о получение данного сообщения.
← →
DVM (2003-11-19 14:19) [1]а оно не попадает в оконную процедуру. Цикл сообщений прекращается от такого сообщения. Вызывает его PostQuitMessage()
← →
kullibin (2003-11-19 14:35) [2]И что тогда делать, как его подавить?
← →
DVM (2003-11-19 14:40) [3]А программа на API или VCL?
← →
Внук (2003-11-19 14:41) [4]Да, в оконную процедуру не попадает, потому как это и не совсем сообщение. Может, OnCloseQuery главной формы поможет отцу русской демократии?
← →
kullibin (2003-11-19 15:00) [5]DVM
Прога на API хотя лучше для обоих вариантов
Внук
А если не поможет? Не подскажешь как сделать
← →
Внук (2003-11-19 15:09) [6]Есть пути решения... Другое дело, не люблю я незакрывающихся программ. Может, лучше эту энергию в мирных целях использовать?
← →
kullibin (2003-11-19 15:14) [7]Внук
В мирных это в каких? И подскажи пожалуйста путь решения, умоляю, очень надо
← →
DVM (2003-11-19 15:18) [8]
> Внук
> А если не поможет? Не подскажешь как сделать
Не поможет. От WM_QUIT не спасет. WM_QUIT убивает процесс как бы изнутри.
Если на API, то в цикле сообщений проверять, что пришло WM_QUIT и запускать вторую копию программы. Ибо WM_QUIT это лишь предвестник того, что процесс убивают и неважно дошло оно до программы или нет.
← →
Внук (2003-11-19 15:22) [9]>>DVM © (19.11.03 15:18) [8]
Несогласный я :) Тем более на API
← →
default (2003-11-19 15:28) [10]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:28) [11]DVM © (19.11.03 15:18)
> WM_QUIT убивает процесс как бы изнутри.
?????????????????????????????????
← →
DVM (2003-11-19 15:38) [12]
> если PostMessage-ом его слать, то да - до оконной процедуры
> не дойдёт, если же SendMessage-ом и поставить свою обработку,
> то приложение так не закроешь
Да не WM_QUIT сам по себе убивает. Когда приходит WM_QUIT то GetMessage возвратить нуль и обычно выполненный цикл сообщений на этом закончится. Надо цикл переделывать.
← →
DVM (2003-11-19 15:44) [13]
> Игорь Шевченко © (19.11.03 15:28) [11]
> DVM © (19.11.03 15:18)
>
>
> > WM_QUIT убивает процесс как бы изнутри.
>
>
> ?????????????????????????????????
Пытаясь сказать красиво я сказал глупость. Наверное лучше так:
WM_QUIT убивает поток как бы "изнутри", т.е. действует также как PostQuitMessage чаще всего в ответ на WM_DESTROY.
← →
default (2003-11-19 15:45) [14]DVM © (19.11.03 15:38) [12]
и что?я знаю это
автору, наверно, надо WM_SYSCOMMAND c SC_CLOSE ловить
← →
DVM (2003-11-19 15:50) [15]
> default © (19.11.03 15:45) [14]
Смотря чего автор хочет достичь. Если надо сделать полностью незакрываемое приложение, то это и
WM_DESTROY и
WM_CLOSE и
WM_QUIT и
WM_SYSCOMMAND + SC_CLOSE
А есть же еще TerminateProcess. Но это уже другая песня.
← →
Игорь Шевченко (2003-11-19 15:54) [16]DVM © (19.11.03 15:44)
Ничего он не убивает. Он устанавливает флажок QS_QUIT у очереди сообщений потока. Если после вызова функции PostQuitMessage потоку будут посланы сообщения, то они будут нормально выбраны. Можно проверить ;)
← →
DVM (2003-11-19 17:54) [17]
> Он устанавливает флажок QS_QUIT у очереди сообщений потока.
> Если после вызова функции PostQuitMessage потоку будут посланы
> сообщения, то они будут нормально выбраны. Можно проверить
А после того как этот флаг установлен, сколько времени поток еще будет получать сообщения и чем это определяется?
Я раньше думал, что когда GetMessage() натыкается на WM_QUIT в очереди сообщений, то возвращает 0 и цикл выборки сообщений построенный по обычным правилам заканчивается и все.
← →
Игорь Шевченко (2003-11-19 18:00) [18]DVM © (19.11.03 17:54)
Это определяется тем, сколько сообщений будет поставлено в очередь после вызова PostQuitMessage. У Рихтера этот момент хорошо описан. Все сообщения очереди выбираются до WM_QUIT. После выбора WM_QUIT дальнейшая работа с очередью, естественно прекращается.
← →
han_malign (2003-11-19 18:06) [19]> что когда GetMessage() натыкается на WM_QUIT в очереди сообщений
- когда взведен флажок QS_QUIT и очередь сообщений пустая, GetMessage - не останавливается в ожидании следующей команды...
← →
DVM (2003-11-19 18:08) [20]
> - когда взведен флажок QS_QUIT и очередь сообщений пустая,
> GetMessage - не останавливается в ожидании следующей команды...
А вот оно что! Это я и хотел узнать.
← →
kullibin (2003-11-25 10:15) [21]>DVM
>Смотря чего автор хочет достичь. Если надо сделать полностью >незакрываемое приложение, то это и
>WM_DESTROY и
>WM_CLOSE и
>WM_QUIT и
>WM_SYSCOMMAND + SC_CLOSE
>А есть же еще TerminateProcess. Но это уже другая песня.
А по подробнее про TerminateProcess можно?
>Игорь Шевченко
То есть что бы возобновить прием сообщений нужно перезапускать программу? А как нибудь программно востановить прием можно?
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c