Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Свернуть все окна  (Прочитано 14384 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
petro
Гость
« : 26-01-2004 20:46 » 

Какое сообщение возникает при выполнении команды "Свернуть все окна"(win+D / win+M)?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 27-01-2004 09:32 » 

ON_COMMAND( ID_СВЕРНУТЬ_ВСЕ_ОКНА, ...   Ага  Ага

Сообщения нет. Есть реакция на контрол (меню или тулбар). На которую можно отреагировать. Например в Винде В MFC можно сделать так:

AfxGetApp()->CloseAllDocuments(TRUE);

параметр указывает, на законченную сессию. Если сессия не закончина, то FALSE

зы. В след раз пиши какя у тебя система.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
petro
Гость
« Ответ #2 : 27-01-2004 10:31 » 

Я хочу отследить в проге какое сообщение пошлет система окну если в Windows пользователь нажимает на ярлычок "свернуть все окна" или комбинацию клавиш win+D. По моему разумению к каждому окну применяется API-ф-ция CloseWindow(hWnd), которая сворачивает окно с указанным хендлом, но в MSDN не сказано возникает ли какое сообщение при этом. Как же тогда отследить это "свертывание". Аська, например, не мсворачивается при win+d.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 27-01-2004 12:25 » new

Аааа, понятно  Ага

Значица так. CloseWidow там не вызывается, тк она закрывает окна. А с win+d их можно снова развернуть. Spy показал кучу сообщений при этом событии, важные из них думаю:

WM_MOVE
WM_WINDOWPOSCHANGED
WM_WINDOWPOSCHANGING

Попробуй их переписать. Кто такая "Аська" я не знаю, но может быть это не самостоятельная прога, а только отображаемое окно какого нить процесса, которое не получает этих сообщений. Посмотри Спайем.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
petro
Гость
« Ответ #4 : 28-01-2004 13:29 » 

Вся проблема в том, что при win+d/"свернуть все окна" не возникает ни WM_SIZE ни WM_SYSCOMAND. Когда окно свернуто по win+d почему-то функция IsIconic(HWND) возвращает FALSE.

Моя проблема состоит в следующем (VisualC++ API): Главное окно имеет стиль WS_EX_TOOLWINDOW - не отображается в панели задач и по ALT+TAB - помещат иконку в трей. При двойном щелчке по иконке в трее окно скрывается/восстанавливается. Тоже самое происходит при выборе соответствующего пункта меню иконки.
После win+d при двойном щелчке на иконке окно не отображается - т.к. не могу проверить что окно свернуто и установить флаг.

Код:
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    switch (wmId)
   {
..........................
        case IDM_POPUP_RESTORE: //всплывающее меню иконки скрыть/показать
            if (!bHide)
              ShowWindow(hWnd,SW_HIDE);
            else
              ShowWindow(hWnd,SW_RESTORE);
            bHide = !bHide;
            break;
..............................
   }
break;

case WM_SHELLNOTIFY:  // сообщение от иконки в трее
if (wParam == IDI_TRAY_ICON)
{
   switch(LOWORD(lParam))
  {
    case WM_LBUTTONDBLCLK:
         //(1)
         SetForegroundWindow(hWnd); //(2)
   SendMessage(hWnd,WM_COMMAND,IDM_POPUP_RESTORE,0);
   break;
   case WM_RBUTTONDOWN:  
   GetCursorPos(&pt);
   SetForegroundWindow(hWnd);
   TrackPopupMenu(hPopupMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL);
   break;
  }
}
break;

(1) хотелось бы поставить проверку типа if(IsIconic(hWnd)) bHide = !bHide
(2) если не поставить SetForegroundWindow окно после win+d по двойному щелчку не восстанавливается
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 28-01-2004 14:35 » 

Значица так, я попробовал на w2k MFC MDI MainFrame

сначала приходит WM_WINDOWPOSCHANGING
потом WM_WINDOWPOSCHANGED
потом WM_MOVE

в обработке WM_MOVE IsIconic работает как часы. при первом win+d  - сворачивание - TRUE, при втором - FALSE. И она приходит последней, те после изменения позиции. Попробуй вставить:

case WM_MOVE:
bHidden = IsIconic(hWnd);
break;

bHidden будет TRUE всё время, пока окно открыто (правда будет приходить куча сообщений при каждом перемещении окна, но кому это мешает?). Когда оно в таскбаре, то его переместить нельзя и bHidden будет FALSE. Конечно логику подгони под свои условия.

Если окошко сворачивается, то должно получать как минимуи одно из этих сообщений.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
petro
Гость
« Ответ #6 : 28-01-2004 18:49 » 

Я понял, если брать Spy++, то сообщение WM_SIZE/SIZE_MINIMIZED приходит к окну если онон создано CreateWindow (или CreateWindowEx со стилем WS_EX_OWERLAPPEDWINDOW), т.е. все в расширенном стиле окна. Я использую WS_EX_TOOLWINDOW - не отображается  на панели задач и при ALT+TAB. При этом при win+d приходят сообщения, связанные в основном с перерисовкой окна и дочерними окнами: WM_NCPAINT, WM_SYNCPAINT, WM_ERASEBKGND, WM_NOTIFY. WM_MOVE не приходит, поэтому как отследить я не знаю.
В кранем случае можно поставить стиль WM_EX_TOPMOST | WM_EX_TOOLWINDOW и тогда оно вообще не будет реагировать на win+d
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 29-01-2004 08:53 » 

petro,  Я подозревал, что это может с WS_EX_TOOLWINDOW быть связано.
Я игрался с такими окошками, но не в таком плане - просто были доп. окошки в основной проге. К сожалению у меня ща под рукой такого проекта нет, а делать - нет времени, чтоб поиграться.
Подожди, но ты же говорил, что оно убирается по win+d? А что Спай показывает если WS_EX_TOOLWINDOW установлен, в момент когда сворачиваешь? Все рисовальные не в счёт. А как ты вообще прогу сделал, как шелловскую длл, или нормальная ЕХЕ с иконкой в трее? Если второе, то должно быть сообщение - иначе нельзя. Если первое, то надо посмотреть...
Ответь сначала на эти вопросы, а лучше всего если клгечно возможно - проект не большой и не "важный", то кинь код на мыло.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
petro
Гость
« Ответ #8 : 29-01-2004 09:25 » 

Джон, у тебя в профиле ящик не обозначен. Мой - petro_ff@mail.ru
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines