Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2011, 20:21   #1
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию К вопросу о сворачиваемости

Либо потому что умные, либо по другой причине ..., но многие и я в свою очередь хочу сделать что-то аля "виджеты в 7".
Поискал по форуму, почитал, вопрос несворачиваемости рассматривался на разных уровнях, в основном обработка сообщений и страшно-непонятные для меня хуки.
Порывшись в DelphiWOrld объединил две статейки про обработку сообщений.
Вот что получилось:
Объявляем свой обработчик сообщения ( в DelphiKingdom нашел "Основы работы с Windows API. " там объяснение в том числе и о соглашении в объявлении процедуры), указываем тип перехватываемого сообщения
Код:
  private
    { Private declarations }
       procedure WMSysCommand(var Msg: TWMSysCommand);
       message WM_SYSCOMMAND;
Далее собственно обработка:
Код:
procedure TMainForm.WMSysCommand;
begin
  Application.CreateHandle;
       if (Msg.CmdType = SC_MINIMIZE)  then
       //ShowWindow(Application.Handle, SW_RESTORE) //Восстановить
       SendMessage(Application.Handle,WM_SYSCOMMAND,SC_RESTORE,0)
       else
       inherited;
end;
Данный код работает - при нажатии на системную кнопку "свернуть" окно не сворачивается, т.е. обработчик работает. Работает в обоих вариантах и ShowWindow и SendMessage. Правда возник небольшой вопрос - работает и с "Application.CreateHandle" и без него, странно но не важно.
Теперь основной вопрос -
Что происходит при нажатии на "кнопку" панели задач "свернуть все окна".
Эта кнопка запускает скрипт(?скрипт ли?) оболочки, Explorer-а
Код:
[Shell]
Command=2
IconFile=explorer.exe,3
[Taskbar]
Command=ToggleDesktop
Далее ИМХО система (читай Explorer) рассылает всем окнам сообщение типа "SC_MINIMIZE" которое должно быть перехвачено и обработано процедурой приведенной выше.
Однако (естественно, иначе этого поста не было бы) мое окно благополучно сворачивается.
Для исследования этого вопроса в DelphiWorld нашел исходник программы ловящей сообщения системы, скомпилил, внес коррективы (лог сохранять) и вот фрагмент лога после нажатия "свернуть все окна":
Код:
wm_ShowWindow
wm_WindowPosChanging
wm_WindowPosChanged
wm_WindowPosChanging
wm_WindowPosChanged
wm_WindowPosChanging
wm_WindowPosChanged
wm_ActivateApp
wm_WindowPosChanging
wm_ShowWindow
wm_WindowPosChanging
wm_NCPaint
wm_GetText
wm_EraseBkGnd
wm_WindowPosChanged
wm_WindowPosChanging
wm_Paint
wm_CtlColorListbox
wm_CtlColorStatic
wm_CtlColorEdit
wm_CtlColorBtn
Это ситуацию однако не прояснило, по крайней мере мне.
Итого: обработчик события рабочий, сообщения типа "wm_ShowWindow" рассылаются, но окно сворачивается.
Значит где-то я в объяснении событий допускаю ошибку, или чего-то не вижу.

Есть еще один вариант учитывая команду скрипта :
Код:
[Taskbar]
Command=ToggleDesktop
Происходит переключение? на другой рабочий стол, который насколько мне известно лишь чистая условность - это просто часть рабочего стола не отрисованная на мониторе.
Этот вариант косвенно подтверждается парами сообщений (хотя сообщения вроде односторонняя вещь?) :
Код:
wm_WindowPosChanging
wm_WindowPosChanged
по количеству совпадающих с числом открытых окон, без учета отрисованных в трее, а также парой "стирание-рисование"
Код:
wm_EraseBkGnd
wm_WindowPosChanged
wm_WindowPosChanging
wm_Paint
хотя и разделенных сообщениями какого-то окна.
Кто может прокомментировать данную ситуацию и варианты решения (optional:).
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Старый 07.09.2011, 20:55   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Хуками куда проще... и надёжнее...

далее:
Код:
Что происходит при нажатии на "кнопку" панели задач "свернуть все окна".
окно получает команду SC_MINIMIZE (Проверял spy++'ом)
Человек_Борща вне форума Ответить с цитированием
Старый 07.09.2011, 21:26   #3
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Хуками куда проще... и надёжнее...
Простота хука - вопрос спорный, я например еще не достиг этой супени просветления.
далее:
Код:
Что происходит при нажатии на "кнопку" панели задач "свернуть все окна".
окно получает команду SC_MINIMIZE (Проверял spy++'ом)
Чудесно! Но у меня в коде эта команда обрабатывается (см. выше), но оно фсежж сворачивается, это вообще был первый вариант.

А как обяснить набор других сообщений (см.выше)?

В теме "Несворачевоемое неактивное окно" есть другой способ решения, я его только что отработал. Но вопрос "что происходит" остался.
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц