Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/46: Рейтинг темы: голосов - 46, средняя оценка - 4.63
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8

Свернуть-развернуть все окна одним кликом

09.05.2017, 15:13. Показов 9441. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с такой проблемой

Стандартым файлом в формате в формате .scf можно только скрыть-отобразить все окна
синтаксис этого файла примерно такой:
Code
1
2
3
4
5
[Shell]
Command=2
IconFile=%SystemRoot%\system32\SHELL32.dll,34
[Taskbar]
Command=ToggleDesktop
Но эта реализация меня не устраивает так-как сворачиваются и окна и гаджеты (часы календарь и тп)
Мне-же нужно было именно свернуть, а не скрыть (наподобии сочетания Win+M), а при повторном нажатии на ярлык или скрипт,
обратно развернуть ранее свернутые окна.
Нашел в интернете такой вот скрипт:
Visual Basic
1
2
3
4
5
rem Свернуть все окна
dim objShell
set objShell = CreateObject("shell.application")
objShell.MinimizeAll
set objShell = nothing
и такой вот еще:
Visual Basic
1
2
3
4
5
rem Развернуть все окна
dim objShell
set objShell = CreateObject("shell.application")
objShell.UndoMinimizeAll
set objShell = nothing
Как объеденить в одном скрипте, чтобы программа понимала какой режим использовать ?

Хотелось-бы изящного решения в три строчки, длинную программу с опросом всех окон я и сам смогу собрать.
Делаю компактную сборку Windows XP, со встроенными драйверпаками и поддержкой гаджетов как в семерке
но именно на этой проблеме споткнулся, вот уже час ищу в интернете, может у кого-то есть идея ?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2017, 15:13
Ответы с готовыми решениями:

Вот есть кнопочки: свернуть, развернуть, закрыть. Как скрыть кнопку развернуть?
Вот есть кнопочки: свернуть, развернуть, закрыть. Как скрыть кнопку развернуть? Что кнопки свирнуть и закрыть оставались на местах....

Свернуть и развернуть все окна
Проблема такая: при сворачивании НЕ главного окна должно сворачиваться все приложение, и наоборот, при разворачивании все должно быть в...

Как развернуть программу, которую скрыли кнопкой "Свернуть все окна"?
Добрый день! Помогите решить проблему: мне надо, что бы при определенном событии программа появлялась по верх всех окон - для привлечения...

14
 Аватар для Sur_L
103 / 63 / 10
Регистрация: 13.02.2017
Сообщений: 178
09.05.2017, 18:51
Не проверял, но логично что objShell.ToggleDesktop
2
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
09.05.2017, 22:40  [ТС]
Это работает, но это ровно то-же самое что я писал в самом начале, тоесть скрывает все окна а не сворачивает
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
11.05.2017, 15:52  [ТС]
-------------
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
11.05.2017, 16:05  [ТС]
Вот я что выяснил:
Даже если все сделать так как задуманно, то всёравно это будет неудобно, и вот почему:
если выполнить >свернуть все окна, а затем *отменить [свернуть все окна]*, то эффект такой-же
как от стандартного значка на панели задач.

Но если же два раза выполнить [свернуть], а затем [развернуть] то действие не выполниться
похоже память для отката заполниться текущим состоянием окон, тоест состоянием сверутых окон

в любом случае действие minimizeall весьма полезное, я его не выбрасываю, выбросить можно UndoMinimizeall.
Я сделал два варианта в панели быстрого запуска (даже значки будут одинаковыми)
при желании рука юзера привыкнет и полюбит единственное правильное действие в его работе
Миниатюры
Свернуть-развернуть все окна одним кликом  
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.05.2017, 16:34
offtop.
У меня рука быстрее всего дотягивается до клавиш Win + D (при чём в слепую).
А подобные значки в панели задач я обычно сразу удаляю, чтобы не занимали место.

Цитата Сообщение от fever brain Посмотреть сообщение
Как объеденить в одном скрипте, чтобы программа понимала какой режим использовать ?
Ты хочешь "повесить" оба кода на одну кнопку, чтобы твоя программа запоминала, какое действие она выполнила последним?
Ну дык, есть файл / реестр, запоминай туда.
1
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
11.05.2017, 16:59  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Win + D
Ну это как кому привычно, я тоже давно знаю о сочетаниях и пользуюсь по возможностью клавишами
а представьте юзера, которого напугал сбой сисемы, и который спешно пытается найти альтернативу
чтобы вытащить документы, (фотки видео и прочее) в этой ситуации, он будет рад стандартным кнопкам
с интуитивным рисунком (на скрине кстате не видно, а написанно в тултипе: свернуть все окна Win + M )
над каждой кнопкой высвечивается что она сделает и ее сочетание, разьве плох этот вариант ? Мне кажется нет

Добавлено через 3 минуты
Цитата Сообщение от Dragokas Посмотреть сообщение
Ты хочешь "повесить" оба кода на одну кнопку
Да так и хотел, но позже передумал, нашел в этом недостатки

Добавлено через 13 минут
Цитата Сообщение от Dragokas Посмотреть сообщение
Ну дык, есть файл / реестр, запоминай туда.
файл, -можно но реестр не вариант, хотелось бы чтобы реестр в таком пустяковом действии тоже оставался девственно чистым
а вот если это и не файл и не реестр а какоето место в памяти которое предостовляется при загрузке ?
вобщем надо записать всего-лишь один бит информации -но вот как это сделать вопрос ((
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.05.2017, 17:12
Цитата Сообщение от fever brain Посмотреть сообщение
хотелось бы чтобы реестр в таком пустяковом действии тоже оставался девственно чистым
Цитата Сообщение от fever brain Посмотреть сообщение
Делаю компактную сборку Windows XP
Что-то мне с большим трудом верится, что у какой-либо сборки реестр остаётся девственно чистым.
Цитата Сообщение от fever brain Посмотреть сообщение
какоето место в памяти которое предостовляется при загрузке ?
Работа с памятью? Забудь, у тебя - VBScript. Потом ещё будешь спрашивать, почему на меня антивирус ругается.
Послушайся совета. Пользуйся стандартными средствами, и не мучай себя и других.
Чем тебя способ через файл не устроил, не понятно. Тем более что у тебя сборка, а значит не стоИт задача полностью сохранить целостность исходной системы.
1
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
11.05.2017, 17:26  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
а значит не стоИт задача полностью сохранить целостность исходной системы
Да там целостность останется, только начинка будет поновее (вместо InthernetExplorer-6, -8 FrameWork 2 (новее пусть юзер ставит)
третий сервис пак, вобщем все самое новое, с возможностью самой быстрой распаковки-установки)
Ну хорошо, файл так файл, пускай он будет во временной папке для таких дел... хоть это меня и не устраивает
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
14.05.2017, 08:42
Файл во временной папке? Это вот так?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Set objshell = CreateObject("shell.application")
    Set fso = CreateObject("scripting.FileSystemObject")
    sFlagFile = fso.GetSpecialFolder(TemporaryFolder) & "\Flag"
    If fso.FileExists(sFlagFile) Then
        objshell.UndoMinimizeALL
        fso.DeleteFile sFlagFile
    Else
        objshell.MinimizeAll
        fso.CreateTextFile sFlagFile
    End If
    Set fso = Nothing
    Set objshell = Nothing
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.12.2024, 21:21
Цитата Сообщение от fever brain Посмотреть сообщение
длинную программу с опросом всех окон я и сам смогу собрать
Это не так-то и просто написать кстати. Нужно знать своим кодом все окна, только из панели задач, а это сложный код.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.12.2024, 15:58
HackerVlad, EnumWindows + GetWindowLong с GWL_EXSTYLE

Получаешь расширенный стиль, проверяешь есть ли флаг WS_EX_APPWINDOW, говорящий что окно имеет значок в панели задач.

Можешь еще проверить, что окно не имеет флага WS_EX_TOOLWINDOW, и что окно топ-уровня с помощью GetWindow + GW_OWNER. Владелец должен отсутствовать.

Примеры.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
02.12.2024, 20:48
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

Вот развёрнутый ответ на этот вопрос:
Из преимуществ:
1. Можно сворачивать все окна, кроме своего (или даже придумать кроме какого-то определённого окна, если вам надо)
2. Мы получаем ровно точное количество, сколько окон было в итоге свёрнуто
3. Этим замечательным кодом мы получаем список всех открытых окон в Windows, которые показываются на панели задач

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
Option Explicit
Private Declare Function DefWindowProcW Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SysAllocStringLen Lib "oleaut32" (ByVal olestr As Long, ByVal BLen As Long) As Long
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As Long, ByVal Value As Long)
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (arr() As Any) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ShowWindowAsync Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
 
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2
Private Const WM_GETTEXT = &HD
Private Const WM_GETTEXTLENGTH = &HE
Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_APPWINDOW = &H40000 ' Окно появляется на панели задач, если оно видимо
Private Const WS_EX_TOOLWINDOW = &H80 ' Окно с маленьким заголовком
Private Const GW_OWNER = 4
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_FORCEMINIMIZE = 11
 
' Считывает заголовок окна
Private Function GetWindowTitle(ByVal hWnd As Long) As String
    Dim lngLen As Long
    
    lngLen = DefWindowProcW(hWnd, WM_GETTEXTLENGTH, 0, ByVal 0)
    
    If lngLen > 0 Then
        PutMem4 VarPtr(GetWindowTitle), SysAllocStringLen(0, lngLen) ' Мгновенно выделить память для строки
        DefWindowProcW hWnd, WM_GETTEXT, lngLen + 1, StrPtr(GetWindowTitle)
    End If
End Function
 
' Считывание всех окон (мой код)
Private Sub MyEnumWindows(ByVal hWnd As Long, WindowHandle() As Long, WindowName() As String, Optional HiddenWindows As Boolean = True, Optional OnlyWindowsInTaskBar As Boolean, Optional NonTitledWindows As Boolean, Optional NoMyWindow As Boolean)
    Dim h As Long
    Dim cnt As Integer
    Dim WindowTitle As String
    
    h = GetWindow(hWnd, GW_HWNDFIRST)
    
    Do While h <> 0
        WindowTitle = GetWindowTitle(h)
        
        If NonTitledWindows = True Or NonTitledWindows = False And WindowTitle <> vbNullString Then
            If HiddenWindows = True Or HiddenWindows = False And IsWindowVisible(h) > 0 Then
                If OnlyWindowsInTaskBar = False Or OnlyWindowsInTaskBar = True And IsShowInTaskBar(h) = True Then
                    If NoMyWindow = False Or NoMyWindow = True And hWnd <> h Then
                        ReDim Preserve WindowHandle(cnt)
                        ReDim Preserve WindowName(cnt)
                        
                        WindowHandle(cnt) = h
                        WindowName(cnt) = WindowTitle
                        
                        cnt = cnt + 1
                    End If
                End If
            End If
        End If
        
        h = GetWindow(h, GW_HWNDNEXT)
    Loop
End Sub
 
' Показывается ли окно в TaskBar
' На самом деле очень сложно определить есть ли окно на панеле задач, поэтому определение гарантируется лишь на 90%
Private Function IsShowInTaskBar(Optional ByVal hWnd As Long) As Boolean
    Dim frmStyle As Long
    
    If hWnd = 0 Then hWnd = GetForegroundWindow
    
    frmStyle = GetWindowLong(hWnd, GWL_EXSTYLE) ' Получаем расширенный стиль окна
    
    If frmStyle > 0 Then
        If IsWindow(hWnd) > 0 Then ' Если такое окно существует
            If IsWindowVisible(hWnd) > 0 Then ' Если окно видимо на экране
                If GetParent(hWnd) = 0 Then
                    If (frmStyle And WS_EX_APPWINDOW) <> 0 Then ' Если бит WS_EX_APPWINDOW установлен, тогда...
                        IsShowInTaskBar = True ' В большинстве случаев это гарантирует, что окно есть на панеле задач
                    Else ' Если WS_EX_APPWINDOW нету, то тогда
                        If (frmStyle And WS_EX_TOOLWINDOW) <> 0 Then ' Если бит WS_EX_TOOLWINDOW установлен, тогда...
                            IsShowInTaskBar = False ' В большинстве случаев это гарантирует, что окна нет на панеле задач
                        Else ' Если нет и WS_EX_APPWINDOW и WS_EX_TOOLWINDOW
                            If GetWindow(hWnd, GW_OWNER) = 0 Then ' Если окно не принадлежит владельцу
                                IsShowInTaskBar = True
                            Else
                                IsShowInTaskBar = False
                            End If
                        End If
                    End If
                Else ' Если GetParent не ноль, то почти на 100% можно быть уверенным, что кнопки нет в таскбаре
                    IsShowInTaskBar = False
                End If
            Else ' Если окно скрыто (не видимо) то в любом случае кнопки на панеле задач не будет!
                IsShowInTaskBar = False
            End If
        Else ' Окно не существует
            IsShowInTaskBar = False
        End If
    End If
End Function
 
' Свернуть все окна
Public Function MinimizeAll(ByVal hWnd As Long, Optional NoMyWindowMinimize As Boolean, Optional ForceMinimize As Boolean = True) As Long
    Dim i As Long
    Dim arrCaptions() As String
    Dim arrHandles() As Long
    Dim cnt As Long
    
    MyEnumWindows hWnd, arrHandles, arrCaptions, False, True, False, NoMyWindowMinimize
    
    For i = 0 To UBound(arrHandles)
        If IsIconic(arrHandles(i)) = 0 Then
            If ShowWindowAsync(arrHandles(i), IIf(ForceMinimize, SW_FORCEMINIMIZE, SW_SHOWMINIMIZED)) > 0 Then
                cnt = cnt + 1
            End If
        End If
    Next
    
    MinimizeAll = cnt
End Function
 
Private Sub Command1_Click()
    Dim hwnds() As Long
    Dim names() As String
    Dim i As Long
    
    MyEnumWindows hWnd, hwnds, names, False, True
    
    If SafeArrayGetDim(hwnds) > 0 Then
        If List1.ListCount > 0 Then List1.Clear
        
        For i = 0 To UBound(names)
            List1.AddItem names(i)
        Next
        
        Me.Caption = "IsShowInTaskBar (" & List1.ListCount & ")"
    End If
End Sub
 
Private Sub Command2_Click()
    Dim mw As Long
    
    mw = MinimizeAll(hWnd) ' Свернуть все окна
    
    Label2.Visible = True
    Label2.Caption = "Было свёрнуто окон: " & mw
End Sub
 
Private Sub Command3_Click()
    Dim mw As Long
    
    mw = MinimizeAll(hWnd, True) ' Свернуть все окна, кроме моего
    
    Label2.Visible = True
    Label2.Caption = "Было свёрнуто окон: " & mw
End Sub
Миниатюры
Свернуть-развернуть все окна одним кликом  
Вложения
Тип файла: zip IsShowInTaskBar (2).zip (9.0 Кб, 16 просмотров)
2
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
03.12.2024, 01:44
У тебя какой-то итальянский TC.
Цитата Сообщение от HackerVlad Посмотреть сообщение
Можно сворачивать все окна, кроме своего (или даже придумать кроме какого-то определённого окна, если вам надо)
А можно определить окно, которое сразу за твоей прогой?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.12.2024, 05:23
Цитата Сообщение от testuser2 Посмотреть сообщение
итальянский TC
что это значит?

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
которое сразу за твоей прогой?
а это как? Z порядок смотреть надо, я не заморачивался по этой теме, но даже сама винда иногда путает окна из Z-порядка
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2024, 05:23
Помогаю со студенческими работами здесь

Программно Развернуть/свернуть окна
Возможно - ли из программы maximize и обратно window (с формой или отчетом) - внутри окна с аксессом?

Свернуть/развернуть окна под кнопку
Как прописать под кнопкой, что бы все формы сворачивались (заменяя стандартные кнопки)?

Кнопки окна (свернуть, развернуть и закрыть)
Всем привет! Помогите с VBA. Пытался найти сам, но нашел только закрыть базу, и закрыть форму. Осталось кнопки &quot;Свернуть&quot; и...

Кнопки и окна: передвинуть, свернуть, развернуть, закрыть.
как передвинуть кнопки свернуть, развернуть, закрыть на несколько пикселов влево, и как в CAPTION расположить свой текст или рисунок с...

Красивая шапка Windows окна, и кнопки закрыть, свернуть, развернуть
Добрый день! Подскажите, можно ли что то сделать со стандартной шапкой Windows окна, и кнопками на ней (свернуть, развернуть,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru