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

Вниз

Знак минимизации окна.   Найти похожие ветки 

 
Псарь   (2011-09-26 22:04) [0]

Какое сообщение WM_XXX нужно словить, чтобы узнать минимизировано ли окно или нет.
WM_Size - SIZE_MINIMIZED - Не работает.
IsIconic не подходит.


 
Омлет ©   (2011-09-26 22:25) [1]

GetWindowPlacement


 
Псарь   (2011-09-27 11:33) [2]


> Омлет ©   (26.09.11 22:25) [1]
>
> GetWindowPlacement


Тогда уж лучше IsIconic.
Нужно сообщение, а не функция.


 
Омлет ©   (2011-09-27 11:46) [3]

> Тогда уж лучше IsIconic.
> Нужно сообщение, а не функция.


Ну-ну. IsIconic - это типа сообщение ))

Ты уж определись, что тебе надо.
Узнать, минимизировано ли окно - это GetWindowPlacement.
Отловить событие сворачивания окна - это WM_SIZE при Message.SizeType = SIZEICONIC.


 
Игорь Шевченко ©   (2011-09-27 11:50) [4]

WM_SYSCOMMAND


 
Омлет ©   (2011-09-27 12:05) [5]

Только надо учесть, что WM_SYSCOMMAND не срабатывает, к примеру, при сворачивании посредством нажатия Win+D или Win+M.


 
Игорь Шевченко ©   (2011-09-27 13:04) [6]

Омлет ©   (27.09.11 12:05) [5]

При Win+D окно "не совсем минимизируется"


 
Омлет ©   (2011-09-27 13:15) [7]

> Игорь Шевченко ©   (27.09.11 13:04) [6]

И какого пользователя это волнует? )


 
Псарь   (2011-09-27 14:37) [8]

> Омлет ©   (27.09.11 11:46) [3]
> Ты уж определись, что тебе надо.

А кто мне тут GetWindowPlacement предлагал, а? :D

> Отловить событие сворачивания окна - это WM_SIZE при Message.SizeType = SIZEICONIC.

Оно не работает.


> Игорь Шевченко ©   (27.09.11 11:50) [4]
>
> WM_SYSCOMMAND


Спасибо.
Но при Win + D, да не работает. Временный вариант.


procedure TForm1.WndProc(var Message: TMessage);
begin
 with Message do
 case Msg of
   WM_SIZE:
   begin
    If (wParam = SIZE_MINIMIZED) then Close; // Не работает. Почему?

   end;

   WM_SYSCOMMAND:
   begin
     If (wParam = SC_MINIMIZE) then Close;  // Работает.

   end;
 end;

 inherited;
end;



 
Cobalt ©   (2011-09-27 15:08) [9]

а ты попробуй вместо
If (wParam = SIZE_MINIMIZED) then Close;
написать
If (wParam = SIZE_MINIMIZED) then memo1.Lines.Add("SIZE_MINIMIZED");


 
Игорь Шевченко ©   (2011-09-27 15:20) [10]


> Но при Win + D, да не работает


При Win+D окно рабочего стола выходит на передний план, заслоняя собой все остальные окна. При этом остальные окна не минимизируются и не изменяют свой размер, насколько мне известно. Они просто заслоняются


 
Псарь   (2011-09-27 15:20) [11]


> Cobalt ©   (27.09.11 15:08) [9]


Не, не пашет.


 
Омлет ©   (2011-09-27 15:23) [12]

Это косяк Delphi.
В 2007 работает как надо.


 
Псарь   (2011-09-27 15:26) [13]


> Омлет ©   (27.09.11 15:23) [12]
>
> Это косяк Delphi.
> В 2007 работает как надо.


Это, работает при Win + D?


WM_SIZE:
  begin
   If (wParam = SIZE_MINIMIZED) then Close; // Не работает. Почему?

  end;



 
Омлет ©   (2011-09-27 15:30) [14]

> Псарь   (27.09.11 15:26) [13]

Да. Работает при Win+M, при Win+D и при обычном сворачивании кнопкой.


 
Псарь   (2011-09-27 15:31) [15]


> Омлет ©   (27.09.11 15:30) [14]


Спасибо за тесты.


 
QAZ   (2011-09-27 20:33) [16]


> Омлет ©   (27.09.11 15:23) [12]
> Это косяк Delphi.
> В 2007 работает как надо.

это не косяк делфи,так работает винда
а вот в 2007 наверно нахитромудрили или у тебя чтото нетак

вообщето
на минимизацию приходит WM_SHOWWINDOW,false,SW_PARENTCLOSING
а на раскрытие WM_SHOWWINDOW,true,SW_PARENTOPENING
и это уже работает действительно везде и всегда


 
Dennis I. Komarov ©   (2011-09-27 20:46) [17]

Надо лезть в генофонд, ибо [10]


 
QAZ   (2011-09-27 20:58) [18]


> Dennis I. Komarov ©   (27.09.11 20:46) [17]
> Надо лезть в генофонд, ибо [10]

в [10] описан догадочный бред


 
Омлет ©   (2011-09-27 21:58) [19]

> QAZ   (27.09.11 20:33) [16]

Вы вообще читали их описание в msdn?

http://msdn.microsoft.com/en-us/library/ms632646(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms632645(VS.85).aspx


 
Игорь Шевченко ©   (2011-09-27 22:19) [20]

QAZ   (27.09.11 20:58) [18]

Уел, однако. Действительно WM_SHOWWINDOW приходит при WIN+D


 
QAZ   (2011-09-27 22:24) [21]


> Омлет ©   (27.09.11 21:58) [19]
> > QAZ   (27.09.11 20:33) [16]
>
> Вы вообще читали их описание в msdn?

читал,хочеш поспорить?


 
QAZ   (2011-09-27 22:27) [22]


> Игорь Шевченко ©   (27.09.11 22:19) [20]

оно приходит всегда


 
Омлет ©   (2011-09-27 22:35) [23]

Есть ещё одна точка зрения: http://blogs.msdn.com/b/oldnewthing/archive/2008/01/15/7113860.aspx )


 
QAZ   (2011-09-27 22:48) [24]


> оно приходит всегда

не, вру, это у меня всегда приходит
для простых смертных для WIN+D
а вот WM_WINDOWPOSCHANGED самая зачетная


 
DVM ©   (2011-09-27 22:58) [25]


> QAZ   (27.09.11 20:58) [18]
>
> > Dennis I. Komarov ©   (27.09.11 20:46) [17]
> > Надо лезть в генофонд, ибо [10]
>
> в [10] описан догадочный бред

Не совсем так. Не знаю как сейчас, но раньше такое действительно имело место.


> Игорь Шевченко ©   (27.09.11 22:19) [20]
> QAZ   (27.09.11 20:58) [18]
>
> Уел, однако. Действительно WM_SHOWWINDOW приходит при WIN+D


Одного только WM_SHOWWINDOW недостаточно бывает, чтобы спрятать все окна и показать рабочий стол. Если окно не отвечает, то оно не будет скрыто таким образом. А тем не менее, окна зависших приложений тоже скрываются. Тут действует комплекс мер.

Окно проводника - не обычное окно. К нему примененена недокументированная функция SetShellWindow, которая и наделяет окно некоторым приоритетом надо остальными окнами. Тут действительно некоторые догадки ибо недокументировано.


 
DVM ©   (2011-09-27 23:08) [26]


> QAZ   (27.09.11 22:48) [24]


> а вот WM_WINDOWPOSCHANGED самая зачетная
>
>

это сообщение никак не влияет на положение и размеры окна


 
QAZ   (2011-09-28 10:59) [27]


> это сообщение никак не влияет на положение и размеры окна

оно не влияет,а информирует что стало,а большего нам и не надо в данном вопросе

> Одного только WM_SHOWWINDOW недостаточно бывает, чтобы спрятать
> все окна и показать рабочий стол. Если окно не отвечает,
>  то оно не будет скрыто таким образом. А тем не менее, окна
> зависших приложений тоже скрываются. Тут действует комплекс
> мер.

эта месага тоже информационная,ставит перед фактом что уже стало с окном
само окно скрывает винда и ей пофиг зависший процесс или нет
окно получит это сообщение после отвиса,если отвиснет вообще

> Не совсем так. Не знаю как сейчас, но раньше такое действительно
> имело место.

десктоп это отец\владелец всех окон и он не может в принципе никуда дигаца относительно других

> Окно проводника - не обычное окно. К нему примененена недокументированная
> функция SetShellWindow, которая и наделяет окно некоторым
> приоритетом надо остальными окнами. Тут действительно некоторые
> догадки ибо недокументировано.

эта функция докапываеца до главного окна любого приложения записанного в реестре в параметре shell,сообщая системе кому слать месаги связаные с "оболочкой"
и никакой уличной магии
можеш попробовать запустить проводник без записи в shell


 
DVM ©   (2011-09-29 00:03) [28]


> QAZ   (28.09.11 10:59) [27]


> десктоп это отец\владелец всех окон и он не может в принципе
> никуда дигаца относительно других

Речь не о том десктопе, а об окне шелла, которое десктоп. Разные вещи.


> эта функция докапываеца до главного окна любого приложения
> записанного в реестре в параметре shell,сообщая системе
> кому слать месаги связаные с "оболочкой"
> и никакой уличной магии

Нет. Магия есть. Результатом действия этой функции на окно (при условии, что ранее эта функция не применялась уже ранее к другому окну) является заморозка окна на заднем плане, окно невозможно закрыть, свернуть, выдвинуть наверх. Возможно еще что-то делает.

Кстати, о каких мессагах ты говоришь, распиши подробнее, раз уж упомянул.


 
DVM ©   (2011-09-29 00:08) [29]


> QAZ   (28.09.11 10:59) [27]

вот тут немного о SetShellWindow

http://www.winehq.org/pipermail/wine-devel/2003-October/021368.html


 
DVM ©   (2011-09-29 00:12) [30]


> QAZ   (28.09.11 10:59) [27]


> можеш попробовать запустить проводник без записи в shell

И что? Проводник не найдя этого ключа в реестре откроется как окно папки. Это вообще тут не при чем.


 
QAZ   (2011-09-29 12:56) [31]


> Нет. Магия есть. Результатом действия этой функции на окно
> (при условии, что ранее эта функция не применялась уже ранее
> к другому окну) является заморозка окна на заднем плане,
>  окно невозможно закрыть, свернуть, выдвинуть наверх. Возможно
> еще что-то делает.

это ты про Program Manager?
для тебя "невозможно закрыть, свернуть, выдвинуть наверх" это магия?
это всеволиш игнор мессаг с этим связаных,при этом его можно спокойно скрыть или выключить :)
хотя для VCLщиков может это и магия
а на win+d реагирует именно проводник и гасит всех кроме сибя


 
DVM ©   (2011-09-29 13:34) [32]


> QAZ   (29.09.11 12:56) [31]


> это ты про Program Manager?
> для тебя "невозможно закрыть, свернуть, выдвинуть наверх"
> это магия?

Нет, нет это. Ты можешь создать окно, которое ВСЕГДА будет находиться позади всех остальных окон? Не сможешь. Ибо всегда найдется второе такое окно, обрабатывающее WM_WINDOWPOSCHANGING так же как и ты. Так вот под окно шелла ты не подлезешь, как бы не старался. Попробуй, удивишься.
В том то и магия, что проводник пользуется недокументированной функцией, которая удерживает его окно ниже всех. Очевидно примерно так же он вылазит наверх и закрывает собой все окна (насчет последнего я не уверен в современных ОС, но раньше, повторюсь, так и было).


> это всеволиш игнор мессаг с этим связаных,при этом его можно
> спокойно скрыть или выключить :)

Да да, подлезь под проводник или создай такое окно.


> хотя для VCLщиков может это и магия

Кстати, для окон, созданных VCL SetShellWindow не отрабатывает как надо, мешает скрытое окно Application.


> а на win+d реагирует именно проводник и гасит всех кроме
> сибя

Так я тебе о том и говорю. И об этом тебе сказал Игорь. Окно десктопа (того который имеет класс окна Progman, т.е окно проводника) подымается наверх, потом скрываются окна. А окно это необычное.

Я примерно 7 лет назад примерно год изучал работу проводника в виде хобби  так сказать, и попутно пытался создать его аналог по мере сил (на Delphi, чиста на API кстати) поэтому, поверь, знаю о чем говорю.


 
QAZ   (2011-09-29 13:49) [33]


> насчет последнего я не уверен в современных ОС, но раньше,
>  повторюсь, так и было

раньше это кагда? 7 лет назад уже ХР было 3года,тогдаже ты был моложе и наивней :)


 
DVM ©   (2011-09-29 16:01) [34]


> QAZ   (29.09.11 13:49) [33]


> раньше это кагда?

Времена Win 2000-XP. Сейчас окнами заправляет DWM, поэтому, думаю, нет необходимости что-то куда то двигать. Мне тогда повторить фокус с перекрыванием чужих окон не удалось, хотя в остальном все работало аналогично проводнику.
Сейчас же "доступны" исходники Win 2000, но я в их подробное изучение не вдавался, нет времени да и неинтересно уже.


> тогдаже ты был моложе и наивней :)

Как и все. И много времени было.


 
QAZ   (2011-09-29 19:17) [35]


> Времена Win 2000-XP.

а я взял и проверил ;)
c Win 2000 по Win 7 ничего не поменялось,из чего делаю вывод что так работает со времен появления ctrl+d
для скорости реакции окна перемещаюца в координаты х=-32000 у=-32000
без копирования содержимого
а уже оттуда минимизируются
это для нормальных приложений
у делфийских это происходит с апплетом,а уже он гасит главные окна через Showwindow


 
DVM ©   (2011-09-29 22:59) [36]


> QAZ   (29.09.11 19:17) [35]


> c Win 2000 по Win 7 ничего не поменялось,из чего делаю вывод
> что так работает со времен появления ctrl+d
> для скорости реакции окна перемещаюца в координаты х=-32000
> у=-32000

Я тоже решил проверить. В W7 окна действительно двигаются, только в координаты -32000 и потом скрываются. Причем окну Progman приходит сообщение WM_USER+8. WM_USER+83 это собственно и есть команда показать десктоп.

Значит я обманул насчет Win2000, надо смотреть раньше на Win98 насчет подвижек десктопа. Я хорошо помню, что такое было и я даже читал где то про это на MSDN.

Кстати, окна полностью зависших программ тоже убираются, хотя напрочь игнорируют все сообщения.


 
QAZ   (2011-09-30 10:34) [37]


> только в координаты -32000

типа твои -32000 круче моих -32000 ? :))



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

Текущий архив: 2012.01.08;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.012 c
15-1314779981
oldman
2011-08-31 12:39
2012.01.08
"Научные" анекдоты


2-1317192067
Alex_C
2011-09-28 10:41
2012.01.08
ValueListEditor - вид 3D как в Object Inspector


15-1316925282
РВА
2011-09-25 08:34
2012.01.08
Подскажите по железу


1-1279206108
я_только_учусь
2010-07-15 19:01
2012.01.08
Как создать процесс c hardware breakpoint?


2-1317480831
Mishanja
2011-10-01 18:53
2012.01.08
Выделение строки в ListView