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

Вниз

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

 
Псарь   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.01 c
6-1249301566
BreakPoint
2009-08-03 16:12
2012.01.08
Какой процесс слушает сокет?


1-1279098114
packpaul
2010-07-14 13:01
2012.01.08
Реализация null-методов класса в Delphi


2-1317586239
alexdn
2011-10-03 00:10
2012.01.08
Тхт файл..


1-1277762626
Deltas
2010-06-29 02:03
2012.01.08
Анимация окон Windows 7


3-1269608174
mefodiy
2010-03-26 15:56
2012.01.08
MySQL запрос





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