Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
105 / 33 / 1
Регистрация: 01.10.2010
Сообщений: 310

Свернуть стороннюю программу в трей

27.06.2011, 21:21. Показов 4923. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как известно, некоторые удобные программы всегда находятся под рукой и во включённом состоянии. Но не всегда хочется, что бы они висели на панели задач, а хочется, чтобы висели в трее. Некоторые производители додумываются до этого(Скайп), а некоторые нет(Офис). Все мы знаем, что сделать кнопку для сворачивания своей программы в трею-не проблема, а вот чужую. Нужно, сделать прогу, в которой указываешь exe файл программы, задаёшь сочетание клавиш(например Альт+А) и после этого, например в том же Майкрософт Офис, нажав АЛЬТ+А, офис сворачивается в трею. Возможно ли вообще такое с помощью .net? Буду признателен за любые идеи по этому поводу.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2011, 21:21
Ответы с готовыми решениями:

Как свернуть программу в трей?
Как свернуть программу в трей и развенуть оттуда? Добавлено через 10 часов 7 минут P.S. Свою программу

Как не закрыть программу, а свернуть в трей?
Здравствуйте! Мне надо чтобы программа не закрывалась, а сворачивалась в трей NotifyIcon1 у меня всегда Visible True Пробовал ...

Свернуть приложение в трей
Здравствуйте! Подскажите, как сделать чтобы при нажатии на буттон или при запуске формы чтобы она сворачивалась в трей?

16
30 / 30 / 3
Регистрация: 25.05.2011
Сообщений: 308
28.06.2011, 01:09
А вопрос можно ? Я вот допустим не знаю как свернуть прогу (свою) в трей... Подскажите?

 Комментарий модератора 
В чужом топе не следует задавать свои вопросы, это как минимум дурной тон.
0
197 / 189 / 15
Регистрация: 09.02.2011
Сообщений: 457
28.06.2011, 10:40
А зачем это нужно? Есть панель задач в которой "висит" приложение пока оно запущено и вы им пользуетесь... Какой смысл загружать память офисом который вам в данный момент не нужен? Скайп, ася, антивирусы - эти программы по понятным причинам постоянно работают, а вот какой резон в работающем постоянно офисе блокноте или браузере?
0
105 / 33 / 1
Регистрация: 01.10.2010
Сообщений: 310
28.06.2011, 19:11  [ТС]
Bazzy, понимаешь, учитывая дух работы в организациях, некоторые приложения(ох, как меня поддержат сейчас бухгалтера с их вездесущим 1С), необходимо убирать с панели задач, чтоб не засорять её, т.к это приложение работает 99% времени работы компьютера. Ну а необходимость быстрого доступа к проге всё равно остаётся. =)
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.06.2011, 19:31
Bazzy, давайте все эти казусы оставим на совести разработчиков.
Вопрос задан, и неважно, что хочет сворачивать Provaider.
Здесь имеет приоритет техническая сторона.

Если нужен пример, пожалуйста.
Есть программа Outlook Express. Она по своей природе не умеет сворачиваться в трей, а этому вопросу посвящены целые топы многочисленных форумов.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.06.2011, 20:21
Provaider, я могу предложить один (или даже пару вариантов), но:
1) Скорее всего на C# (если получится, постараюсь на VB.NET перевести);
2) По каким критериям определять что именно эту программу надо свернуть (есть идеи какие-нибудь, самому придумывать лень)?
0
105 / 33 / 1
Регистрация: 01.10.2010
Сообщений: 310
28.06.2011, 21:19  [ТС]
Да, есть идеи. Просто указываем exe файл программы перед её запуском.
0
Студент :)
895 / 328 / 12
Регистрация: 29.01.2011
Сообщений: 1,679
28.06.2011, 21:57
Цитата Сообщение от SSTREGG Посмотреть сообщение
По каким критериям определять что именно эту программу надо свернуть (есть идеи какие-нибудь, самому придумывать лень)?
В отдельном файле создать списак программ,которые требуется сворачивать...можно программу с гуи написать)))
0
197 / 189 / 15
Регистрация: 09.02.2011
Сообщений: 457
29.06.2011, 00:56

Не по теме:

Боюсь опять нарваться на ваши неодобрения и гнев ))) Но не очень понятно Автору необходимо понять как это написать или ему просто нужен данный функционал в виде программы?



Добавлено через 1 час 10 минут
Есть приложение TrayIt! и на подобии...

А в целом алгоритм примитивен:
Получаем список идентификаторов окон EnumWindows
Проверяем видимое ли оно IsWindowVisible
Получаем имя окна GetWindowTextLength,GetWindowText
Выводим в какой-нибудь контрол
Выбираем в нем то которое хотим свернуть
Сворачиваем ShowWindow
Создаем NotifyIcon...
Ну и в обратном порядке для отображения...

Будет минутка может сваяю...

VB.NET
1
2
3
4
5
Public Declare Function EnumWindows Lib "user32" (ByVal Adress As CallBack, ByVal y As Integer) As Integer
    Public Declare Function IsWindowVisible Lib "user32.dll" (ByVal hwnd As IntPtr) As Boolean
    Public Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Int32
    Public Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Int32) As Int32
    Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal nCmdShow As IntPtr) As Boolean
2
105 / 33 / 1
Регистрация: 01.10.2010
Сообщений: 310
29.06.2011, 17:09  [ТС]
Автору необходимо понять 2 вещи:1)возможно ли это вообще(
Bazzy доказал, что это возможно), 2)как это сделать(спасибо Bazzy за обрисовку общих черт). Теперь хотелось бы увидеть хотя бы частичную реализацию данного проекта этим способом.
Пока я сегодня торчал на солнцепёке, у меня появилась одна идея. А что если запускать приложение в нашем приложении? То есть указываем экзешник проги, указываем некоторые настройки к программе(размер будущего окна, свернуть в трею, горячие клавиши для сворачивания, прозрачность...), и вуаля, мы получаем прямо таки решатор нескольких задач, чьих аналогов я либо не видел. либо, что более вероятно, не нашёл... Возможен ли вообще такой расклад, когда программа запускает в себе(в своём окне) другую?
0
197 / 189 / 15
Регистрация: 09.02.2011
Сообщений: 457
04.07.2011, 18:18
Лучший ответ Сообщение было отмечено как решение

Решение

На форму кинуть две кнопки и DataGridView

VB.NET
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
Imports System.Runtime.InteropServices
Public Class Form3
 
          
 
   
    Public Delegate Function CallBack(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Boolean
 
    
   
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function
    <DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
    Public Shared Function GetParent(ByVal hWnd As IntPtr) As IntPtr
    End Function
    <DllImportAttribute("user32.dll", EntryPoint:="GetClassLongW")> _
    Public Shared Function GetClassLong(<InAttribute()> ByVal hWnd As System.IntPtr, ByVal nIndex As Integer) As IntPtr
    End Function
    <DllImportAttribute("user32.dll", EntryPoint:="GetClassLongPtrW")> _
    Public Shared Function GetClassLongPtr(<InAttribute()> ByVal hWnd As System.IntPtr, ByVal nIndex As Integer) As IntPtr
    End Function
    Private Shared Function GetClassLongBoth(ByVal hwnd As IntPtr, ByVal nIndex As Integer) As IntPtr
        If IntPtr.Size = 4 Then
            'Must be a 32 bit OS or 32 bit process running on 64 bit OS
            Return GetClassLong(hwnd, nIndex)
        Else
            'Must be a 64 bit process
            Return GetClassLongPtr(hwnd, nIndex)
        End If
    End Function
 
    Public Declare Function EnumWindows Lib "user32.dll" (ByVal Adress As CallBack, ByVal y As Integer) As Integer
    Public Declare Function IsWindowVisible Lib "user32.dll" (ByVal hwnd As IntPtr) As Boolean
    Public Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Int32
    Public Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Int32) As Int32
    Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal nCmdShow As IntPtr) As Boolean
    Private ActiveWindows As New System.Collections.ObjectModel.Collection(Of IntPtr)
 
 
    Public Const WM_GETICON As UInteger = &H7F
    Public NotifyCounter As Integer = 0
    Dim arrNotifyicon As NotifyIcon()
 
 
    Public Function GetActiveWindows() As ObjectModel.Collection(Of IntPtr)
        ActiveWindows.Clear()
        EnumWindows(AddressOf Enumerator, 0)
        Return ActiveWindows
    End Function
 
    Private Function Enumerator(ByVal hwnd As IntPtr, ByVal lParam As Integer) As Boolean
        If IsWindowVisible(hwnd) Then
            ActiveWindows.Add(hwnd)
        End If
        Return True
    End Function
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        DataGridView1.DataSource = GetWindowList()
        DataGridView1.Columns("hwnd").Visible = False
        Dim dgvcol As New DataGridViewCheckBoxColumn
        Dim dgvimgcol As New DataGridViewImageColumn
        Dim NotifyIndex As New DataGridViewTextBoxColumn
 
        dgvimgcol.Name = "Icon"
        dgvimgcol.HeaderText = "Icon"
        dgvcol.Name = "IsVisible"
        dgvcol.HeaderText = "IsVisible"
        NotifyIndex.Name = "NotifyIndex"
        NotifyIndex.HeaderText = "NotifyIndex"
        NotifyIndex.Visible = False
        DataGridView1.Columns.Add(dgvcol)
        DataGridView1.Columns.Add(dgvimgcol)
        DataGridView1.Columns.Add(NotifyIndex)
        DataGridView1.Columns("WindowName").ReadOnly = True
        For Each dgr As DataGridViewRow In DataGridView1.Rows
            dgr.Cells("IsVisible").Value = True
            Dim icn As Icon = Nothing
            icn = GetWindowIcon(dgr.Cells("hwnd").Value)
            If Not icn Is Nothing Then
                dgr.Cells("Icon").Value = icn.ToBitmap
            End If
 
        Next
    End Sub
 
    Function GetWindowList() As DataTable
        Dim dt As New DataTable
        dt.Columns.Add("hwnd")
        dt.Columns.Add("WindowName")
        GetActiveWindows()
        For Each hwnd As IntPtr In ActiveWindows
            Debug.Print(hwnd)
            Dim WindName As String = ""
            WindName = Space(GetWindowTextLength(hwnd) + 1)
            GetWindowText(hwnd, WindName, GetWindowTextLength(hwnd) + 1)
            WindName = WindName.Substring(0, WindName.Length - 1)
            dt.Rows.Add(hwnd, WindName)
        Next
        Return dt
    End Function
 
 
    Sub AddNotify(ByVal icn As Icon, ByVal text As String, ByVal hwnd As Integer, ByVal dgvrowindex As Integer)
        NotifyCounter += 1
        ReDim Preserve arrNotifyicon(NotifyCounter)
        Dim ni As NotifyIcon = New System.Windows.Forms.NotifyIcon
        ni.Icon = icn
        ni.Text = text.Substring(0, 63)
        ni.Tag = hwnd
        Dim cm As New ContextMenuStrip
        cm.Items.Add("Возобновить " & text)
        cm.Tag = NotifyCounter & "|" & dgvrowindex & "|" & hwnd
        AddHandler cm.ItemClicked, AddressOf cmItemClicked
        ni.ContextMenuStrip = cm
        ni.Visible = True
        arrNotifyicon(NotifyCounter) = ni
        Me.arrNotifyicon(NotifyCounter).Visible = True
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
 
        Dim hwnd As Integer = 0
        Integer.TryParse(DataGridView1.CurrentRow.Cells("hwnd").Value, hwnd)
 
        If DataGridView1.CurrentRow.Cells("IsVisible").Value = True Then
            If IsWindowVisible(hwnd) Then
                Dim icn As Icon = Icon.FromHandle(DataGridView1.CurrentRow.Cells("Icon").Value.GetHicon)
                AddNotify(icn, DataGridView1.CurrentRow.Cells("WindowName").Value, hwnd, DataGridView1.CurrentRow.Index)
                ShowWindow(hwnd, 0)
                DataGridView1.CurrentRow.Cells("IsVisible").Value = False
                DataGridView1.CurrentRow.Cells("NotifyIndex").Value = NotifyCounter
            End If
        Else
            If Not IsWindowVisible(hwnd) Then
                Dim NIindex As Integer = 0
                Integer.TryParse(DataGridView1.CurrentRow.Cells("NotifyIndex").Value, NIindex)
                ShowWindow(hwnd, 1)
                DataGridView1.CurrentRow.Cells("IsVisible").Value = True
                arrNotifyicon(NIindex).Visible = False
                arrNotifyicon(NIindex).Dispose()
                NotifyCounter -= 1
            End If
        End If
 
    End Sub
 
 
    Public Function GetWindowIcon(ByVal WindowHandle As Integer) As Icon
        Dim parenthwnd As IntPtr = GetParent(WindowHandle)
        Dim childhwnd As IntPtr
 
        If Not parenthwnd = IntPtr.Zero Then
            childhwnd = parenthwnd
        Else
            childhwnd = WindowHandle
        End If
        Dim IconHandle As IntPtr = SendMessage(childhwnd, WM_GETICON, 2, 0)
        If IconHandle = IntPtr.Zero Then
            IconHandle = SendMessage(childhwnd, WM_GETICON, 0, 0)
        End If
 
        If IconHandle = IntPtr.Zero Then
            IconHandle = SendMessage(childhwnd, WM_GETICON, 1, 0)
        End If
        If IconHandle = IntPtr.Zero Then
            IconHandle = GetClassLongBoth(childhwnd, -14)
        End If
        If IconHandle = IntPtr.Zero Then
            IconHandle = GetClassLongBoth(childhwnd, -34)
        End If
        If Not IconHandle = IntPtr.Zero Then
            Return Icon.FromHandle(IconHandle)
        End If
        Return Nothing
    End Function
 
    Sub cmItemClicked(ByVal sender As Object, ByVal e As EventArgs)
        Dim tagspl As String() = sender.tag.ToString.Split("|")
        Dim NIindex As Integer = 0
        Dim hwnd As Integer = 0
        Dim dgvrowindex As Integer = 0
        Integer.TryParse(tagspl(0), NIindex)
        Integer.TryParse(tagspl(1), dgvrowindex)
        Integer.TryParse(tagspl(2), hwnd)
        ShowWindow(hwnd, 1)
        DataGridView1.Rows(dgvrowindex).Cells("IsVisible").Value = True
        arrNotifyicon(NIindex).Visible = False
        arrNotifyicon(NIindex).Dispose()
        NotifyCounter -= 1
    End Sub
End Class
3
105 / 33 / 1
Регистрация: 01.10.2010
Сообщений: 310
04.07.2011, 21:03  [ТС]
Ого! Good work!(если я уж начал учить английский=)) Можешь комментарии к коду написать? Буду очень благодарен

Добавлено через 7 минут
Да, без комментариев здесь не обойтись, я сам ничего не понял=(
0
 Аватар для Ciberst
559 / 436 / 21
Регистрация: 16.12.2010
Сообщений: 953
21.07.2011, 21:36
Лучший ответ Сообщение было отмечено как решение

Решение

Огромное спасибо Bazzy, немного переделал код, добавил ряд фич классных на мой взгляд, конечно могут быть и баги и глюки (сильно не обкатывал), так же к исходному коду добавил небольшую документацию, тема действительно интересная и если будет у меня желание заняться этим проектом еще чуть-чуть, то буду потихоньку выкладывать новые релизы в этой теме. В общем смотрим и критикуем.
Вложения
Тип файла: 7z InTray.7z (347.8 Кб, 114 просмотров)
4
 Аватар для Nikosinskiy
0 / 0 / 0
Регистрация: 21.07.2011
Сообщений: 4
21.07.2011, 21:52
Фига, вот это работу проделал, респектую!
0
105 / 33 / 1
Регистрация: 01.10.2010
Сообщений: 310
21.07.2011, 22:26  [ТС]
Ciberst постарался на славу!
0
30 / 30 / 3
Регистрация: 25.05.2011
Сообщений: 308
21.07.2011, 22:32
Работа на 100 с + ...
0
22.07.2011, 17:11

Не по теме:

все Обновления данной программы вынес в отдельную тему Программа сворачивает в трей другие программы

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2011, 17:11
Помогаю со студенческими работами здесь

Свернуть приложение в трей
на форме есть Checkbox. Если поставить галочку, то приложение должно свернуться в трей, для восстановление необходимо будет кликнуть по...

Как свернуть две формы в одну иконку в трей и развернуть
И так думаю всё понятно по названию темы но еще раз скажу у меня две формы при сворачивании одной должна свернуться другая, но Private Sub...

Свернуть программу в трей
Доброго времени суток, вот написал программу, подскажите как её свернуть в трей, и как потом вызвать при помощи горячих клавиш?

Свернуть программу в трей
Доброго времени суток, столкнулся с проблемой,сворачивания программы в трей. В C++ Builder XE2, компонент TrayIcon, по логике он, по...

Свернуть программу в трей
Всем доброго времени суток.Мое приложение по клику на Minimize box должно свернуться в трей.Добавляю NotifyIcon и делаю так: ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru