Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

Как отловить системную команду закрытия.   Найти похожие ветки 

 
LEXX_55   (2005-05-30 14:28) [0]

Здраствуйте знатоки. Усть системная команда SC_MINIMIZE - свернуть окно. А какая системная команда на закрытие окна (приложения)?


 
Чапаев ©   (2005-05-30 14:39) [1]

Угадай с трёх раз. Не SC_CLOSE ли случайно?


 
LEXX_55   (2005-05-30 14:44) [2]


> Чапаев ©   (30.05.05 14:39) [1]


Возможно. Только не перхватывается. Мне надо запретить выход из приложения. Что бы при попытке закрыть приложение оно не закрывалось а сварачивалось. SC_CLOSE - не пашет!


 
DVM ©   (2005-05-30 14:50) [3]


> SC_CLOSE - не пашет!

как делал?


 
begin...end ©   (2005-05-30 14:52) [4]

> LEXX_55   (30.05.05 14:44) [2]

Приведите код обработки сообщения.


 
LEXX_55   (2005-05-30 14:52) [5]


> DVM ©   (30.05.05 14:50) [3]

if (Msg.WParam = SC_CLOSE) then MFHideClick(Self);


 
begin...end ©   (2005-05-30 14:53) [6]

> LEXX_55   (30.05.05 14:52) [5]

if Msg.WParam and $FFF0 = SC_CLOSE then ...


 
LEXX_55   (2005-05-30 14:55) [7]


> begin...end ©   (30.05.05 14:53) [6]

Не хотит. Просто закрывает приложение.


 
DVM ©   (2005-05-30 14:57) [8]

HWND hWnd = Form1->Handle; // здесь Handle нужного окна
HMENU hMenu = GetSystemMenu(hWnd, false);
if (hMenu)
       {
       EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED);
       }

или даже

DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);


 
Alex870   (2005-05-30 15:04) [9]

А почему не использовать wm_close, ну например:

procedure MyFormClose(var M: tagMSG); message wm_close;
а там делать то, что угодно. Если Вы VCL не используете, то аналогично можно реализовать и в главной процедуре окна.


 
LEXX_55   (2005-05-30 15:19) [10]


> Alex870   (30.05.05 15:04) [9]

форма должна закрыватья, но другим путем.


 
alpet ©   (2005-05-30 15:36) [11]


type
 TForm1 = class(TForm)
...
procedure WMCommand (var msg: TMessage); message WM_SYSCOMMAND;
end
...
procedure TForm1.WMCommand(var msg: TMessage);
begin
if msg.WParam = SC_CLOSE then msg.Result := 0
 else DefaultHandle (msg);
end;


Вот так сообщение блокируется. Но лучше если обработка будет происходить через перехват оконной процедуры (см. свойство TControl.WindowProc), чтобы обработка других кодов происходила правильно.


 
LEXX_55   (2005-05-30 15:43) [12]


> alpet ©   (30.05.05 15:36) [11]

у меня почти такойже код только вместо
then msg.Result := 0
else DefaultHandle (msg);

стоит
then MFHideClick(Self);
результат одинаков.


 
Alex870   (2005-05-30 16:03) [13]

Я так понял, что в WParam передается не только uCmdType, но и координаты мыши на кнопке (могу ошибаться), однако если написать if ((M.wParam and $FFF0) >= $360) and ($370 >= (M.wParam and $FFF0)) then ... для стандартного заголовка - работает.


 
alpet ©   (2005-05-30 16:03) [14]

То есть, у меня этот код работает, а у тебя нет?


 
alpet ©   (2005-05-30 16:06) [15]

WM_SYSCOMMAND
wParam
Specifies the type of system command requested. This parameter can be one of the following values.

lParam
The low-order word specifies the horizontal position of the cursor, in screen coordinates, if a window menu command is chosen with the mouse. Otherwise, this parameter is not used.
...


 
Alex870   (2005-05-30 16:14) [16]


> alpet ©   (30.05.05 16:06) [15]

А ты выведи, ну скажем на Label, значение WParam, и пощелкай по кнопке в разных местах.


 
Alex870   (2005-05-30 16:38) [17]

Выяснил (признаю, что частично ошибался) в Low-order WParam WM_SYSCOMMAND передается yPos (абсолютная) координат мыши, а в Hi - xPos. В LParam не передается ничего!!! Это конечно противоречит справке, но мне кажется тут дело в Messages.pas, мне кажется, что мы получаем что-то другое, нежели WM_SYSCOMMAND.


 
alpet ©   (2005-05-30 16:48) [18]

У тебя действительно странно код себя ведет, посмотри может ошибка где.

procedure TForm1.WMCommand(var msg: TMessage);
begin
label1.Caption := format ("WM_SYSCOMMAND, wParam = $%x, lParam = $%x",
                       [msg.wparam, msg.lparam]);
if msg.WParam = SC_CLOSE then msg.Result := 0
 else DefaultHandler (msg);
end;

У меня при перетаскивании формы (мышью за заголовок) wParam всегда равно $F012, а lParam меняется и реально означает экранные координаты курсора мыши.


 
Alex870   (2005-05-30 16:58) [19]

Понял свою ошибку. Я использовал tagMsg, а не TMessage.


 
LEXX_55   (2005-05-30 17:17) [20]


> alpet ©   (30.05.05 16:48) [18]

создаю новый проект. делаю все что было предложено. все работает. в соем же проекте ничерта не пашет. почему там где надо ничего не работает? :(


 
alpet ©   (2005-05-30 19:16) [21]

Ошибки значит в первом проекте есть. Смотри как доходит сообщение WM_SYSCOMMAND до окна формы (Spy++ / Winsight32).


 
begin...end ©   (2005-05-30 19:49) [22]

> alpet ©   (30.05.05 15:36) [11]

> if msg.WParam = SC_CLOSE

См. [6].


 
alpet ©   (2005-05-30 20:38) [23]

begin...end ©   (30.05.05 19:49) [22]
Мда, пожалуй надо вчитаться было:

In WM_SYSCOMMAND messages, the four low-order bits of the wParam parameter are used internally by the system. To obtain the correct result when testing the value of wParam, an application must combine the value 0xFFF0 with the wParam value by using the bitwise AND operator.


 
LEXX_55   (2005-05-31 06:26) [24]

Подождите....
Почему тогда это работает?
if (Msg.WParam = SC_MINIMIZE) then MFHideClick(Self);


 
LEXX_55   (2005-05-31 08:02) [25]

Кажись я все понял. Команды работают. Только не блокируются. Т.е. прога выполняет то что мне нужно но все равно закрывается. надо искать другой путь.


 
LEXX_55   (2005-05-31 08:06) [26]

Получил нужный результат. Всем спасибо!!!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.15 c
1-1120835930
Qwertyk
2005-07-08 19:18
2005.07.25
Потеря качества при уменьшении иображения


1-1120663517
Vasya.ru
2005-07-06 19:25
2005.07.25
Вопрос мой закрыли, ответа не получил


8-1111485820
maxistent
2005-03-22 13:03
2005.07.25
Как выдрать кадры из avi-файла...


1-1120468392
PEKAHT
2005-07-04 13:13
2005.07.25
Скролинг в TreeView


1-1120671763
Kulon
2005-07-06 21:42
2005.07.25
Delphi and AutoCAD2004





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский