Форум: "Начинающим";
Текущий архив: 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