Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.10;
Скачать: CL | DM;

Вниз

Что за сообщение?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
14-29564
Knight
2004-01-20 13:46
2004.02.10
Радиотелефон - Premier magic 100...


1-29374
Devel
2004-01-28 19:38
2004.02.10
как общаться с cервисом ?


3-29230
Silver_
2004-01-19 11:09
2004.02.10
Как заставить ADODataSet перещитать вичсляемые поля


1-29315
Mr. X
2004-01-30 08:51
2004.02.10
CD-ROM


1-29310
HolyMan
2004-02-02 03:08
2004.02.10
WinSpeechAPI