ShowDesktop

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alexey24
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.09.2006 (Ср) 15:59

ShowDesktop

Сообщение Alexey24 » 22.10.2006 (Вс) 7:37

Нужна свежая идея!

Мне надо показать Desktop если он скрыт под окнами других программ. Для этого можно использовать Ctrl+Esc(WinKey)+D или ToggleDesktop. Но...

Когда Desktop уже открыт, то [повторное] использование Ctrl+Esc(WinKey)+D или ToggleDesktop вызывает обратный эффект - все окна восстанавливаются и Desktop скрывается.

Вопросы:
1) Есть ли функция API работающая только для открытия, например, под названием ShowDesktop? (Поиск по этому имени не дал результатов.)

2) Если нет, то как мне анализировать состояние рабочего стола "скрыт/нескрыт" для того, чтобы осуществлять посылку Ctrl+Esc(WinKey)+D или вызов ToggleDesktop только в нужной ситуации - для открытия рабочего стола.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 22.10.2006 (Вс) 9:32

GetForegroundWindow, GetDesktopWindow

Код: Выделить всё
if (GetForegroundWindow<>GetDesktopWindow) then <десктоп скрыт>


За декларациями функций, как всегда, лезем в api-guide :)

Alexey24
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.09.2006 (Ср) 15:59

Сообщение Alexey24 » 22.10.2006 (Вс) 10:01

Увы, вариант с
Код: Выделить всё
If GetForegroundWindow& <> GetDesktopWindow Then

не работает.

Детали интерфейса:
Иконка в трэе показывает BaloonTip, юзер кликает на "балун" и если рабочий стол скрыт - показывается Desktop (a.k.a. рабочий стол :)

Проблема:
GetForegroundWindow всегда возвращает handle на форму моей программы, для которой я сделал subclass (трэй и другие доп. функции), а не на рабочий стол.


Какой work-around тут ещё можно придумать? Бился над этим ещё год назад и плюнул.
Хотел опять было сейчас реализовать эту фичу, но не идёт никакого свежего решения в голову.

Нужны идеи!
Последний раз редактировалось Alexey24 22.10.2006 (Вс) 10:19, всего редактировалось 1 раз.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 22.10.2006 (Вс) 16:06

Скрывай после клика балун и форму и снова проверяй GetForegroundWindow :)

Alexey24
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.09.2006 (Ср) 15:59

Сообщение Alexey24 » 23.10.2006 (Пн) 8:22

Amed писал(а):Скрывай после клика балун и форму и снова проверяй GetForegroundWindow :)


Так всё и есть. Форма спрятана, а в трэе иконка, которая посылает сообщения в балунах, обрабатывает msg и вызывает соответствующие обработчики в главной форме.

При NIN_BALLOONUSERCLICK - прячется балун и вызывается процедура FormObject.TrayIconBalloonClick в главной форме.

Тут я, каюсь, нашёл лишнюю и ненужную строку в обработке NIN_BALLOONUSERCLICK
Код: Выделить всё
SetForegroundWindow (FormObject.hWnd)

Из-за неё GetForegroundWindow и выдавала хэндл на главную форму.

Строку с SetForegroundWindow я убрал.

После чего GetForegroundWindow (на всех этапах обработки) NIN_BALLOONUSERCLICK выдаёт хэндл на окно tooltips_class32, которое является дочерним окном Shell_TrayWnd.
И абсолютно без разницы: закрыт у меня рабочий стол или нет.

Просто уныние...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 23.10.2006 (Пн) 10:04

Берешь WindowFromPoint, можно с нескольких разных координат, если все = GetDesktopWindow, то считаем, что окна свернуты.
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.10.2006 (Сб) 22:27

Ещё раз для Antonariy и остальных, кто не понял этого из поста Alexey24: настоящий десктоп, хендл которого возвращается по GetDesktopWindow, полностью покрыт листвьюхой с иконками.
И сравнивать результат GetForegroundWindow нужно именно с этой листвьюхой.
А настоящий десктоп, хендл которого возвращается по GetDesktopWindow, никогда (если эксплорер запущен) не вернётся ни по GetForegroundWindow, ни по WindowFromPoint.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот, Google-бот, Majestic-12 [Bot] и гости: 135

    TopList