Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
3-29238
EugeneP
2004-01-19 13:11
2004.02.10
Simple ClientDataSet


14-29587
Карелин Артем
2004-01-21 15:58
2004.02.10
Я разочаровался в билдере.


1-29345
Unax
2004-01-29 01:24
2004.02.10
MDI приложение


3-29209
Caries
2004-01-20 11:14
2004.02.10
Как программно добавить поле lookup в TTable?


6-29496
closer
2003-12-04 23:28
2004.02.10
Каким образом можно сменить рабочую группу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский