-
Notifications
You must be signed in to change notification settings - Fork 12
/
TaskList.cls
288 lines (191 loc) · 6.77 KB
/
TaskList.cls
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "TaskList"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
'--------------------------------------------------------------------------------
' Component : TaskList
' Project : ViDock
'
' Description: Manages all the currently running processes and their windows
' Like a taskbar or task manager
'
'--------------------------------------------------------------------------------
Option Explicit
Private m_Processes As Collection
Private m_ActiveWindow As Window
Private m_ActiveProcess As Process
Public Function Update(ByVal hWndExclude As Long)
On Error GoTo Handler
Dim theWindow As Window
Dim newForeGroundWindow As Long
newForeGroundWindow = GetForegroundWindow
If newForeGroundWindow <> hWndExclude Then
g_hwndForeGroundWindow = newForeGroundWindow
Set theWindow = Me.GetWindowByHWND(g_hwndForeGroundWindow)
If Not theWindow Is Nothing Then
theWindow.Flashing = False
End If
End If
DeleteDeadHandles
UpdateFlashStatusOfEachProcess
ShellHelper.EnumWindowsAsTaskList Me
Exit Function
Handler:
LogError Err.Number, "EnumerateTasks(); " & Err.Description, "winTaskBar"
End Function
Private Function UpdateFlashStatusOfEachProcess()
On Error GoTo Handler
Dim thisProcess As Process
For Each thisProcess In m_Processes
thisProcess.UpdateFlashStatus
Next
Exit Function
Handler:
LogError Err.Number, "UpdateFlashStatusOfEachProcess(); " & Err.Description, "ObjTaskList"
End Function
Public Function GetProcessByHWND(ByRef hWnd As Long) As Window
Dim thisProcess As Process
Dim thisWindow As Window
For Each thisProcess In m_Processes
Set thisWindow = thisProcess.GetWindowByHWND(hWnd)
If Not thisWindow Is Nothing Then
Set GetProcessByHWND = thisProcess
Exit For
End If
Next
End Function
Public Function GetWindowByHWND(ByRef hWnd As Long) As Window
Dim thisProcess As Process
Dim thisWindow As Window
For Each thisProcess In m_Processes
Set thisWindow = thisProcess.GetWindowByHWND(hWnd)
If Not thisWindow Is Nothing Then
Set GetWindowByHWND = thisWindow
Exit For
End If
Next
End Function
Public Property Get ActiveProcess()
Set ActiveProcess = m_ActiveProcess
End Property
Public Function DeleteDeadHandles()
On Error GoTo Handler
Dim thisProcess As Process
Set m_ActiveWindow = New Window
Set m_ActiveProcess = New Process
For Each thisProcess In m_Processes
thisProcess.CheckWindowHandles
If Not thisProcess.HasWindows Then
If thisProcess.Pinned Then
thisProcess.Running = False
Else
'Object falls out of scope
If Exists(m_Processes, thisProcess.GetKey) Then
m_Processes.Remove thisProcess.GetKey
End If
End If
End If
Next
Exit Function
Handler:
LogError Err.Number, "DeleteDeadHandles(); " & Err.Description, "ObjTaskList"
End Function
Public Property Get Processes() As Collection
Set Processes = m_Processes
End Property
Public Function PrintProcesses()
Dim thisProcess As Process
For Each thisProcess In m_Processes
Debug.Print thisProcess.Id & " - " & thisProcess.Path
thisProcess.PrintWindows
Next
End Function
Public Function RemoveWindow(ByRef theWindow As Window)
If Not theWindow Is Nothing Then
theWindow.Parent.RemoveWindow theWindow
If Not theWindow.Parent.HasWindows Then
If theWindow.Parent.Pinned Then
theWindow.Parent.Running = False
Else
'Object falls out of scope
If Exists(m_Processes, theWindow.Parent.GetKey) Then
m_Processes.Remove theWindow.Parent.GetKey
End If
End If
End If
End If
End Function
Public Function AddWindowByHwnd(hWnd As Long)
Dim ProcessID As Long
Dim processPath As String
Dim thisProcess As Process
Dim ExistsInTaskList As Boolean
Dim newProcess As Process
Dim newWindow As Window
'Check hWnd is valid
If hWnd = 0 Then
'Debug.Print "Invalid hWnd; 0"
Exit Function
End If
ProcessID = GetProcessID(hWnd)
processPath = ProcessHelper.GetProcessPath(ProcessID)
ExistsInTaskList = False
If processPath <> vbNullString Then
'Check if ProcessPath exists in collection
ExistsInTaskList = Exists(m_Processes, processPath & "_")
If ExistsInTaskList Then
Set thisProcess = m_Processes(processPath & "_")
End If
Else
'Check if ProcessID exists in collection
ExistsInTaskList = Exists(m_Processes, CStr(ProcessID) & "_")
If ExistsInTaskList Then
Set thisProcess = m_Processes(CStr(ProcessID) & "_")
End If
End If
If Not ExistsInTaskList Then
Set newProcess = New Process: newProcess.Constructor ProcessID, processPath
newProcess.X = -1
If Not newProcess.IconIsValid Then
If newProcess.CreateIconFromhWnd(hWnd) = False Then
Debug.Print "Troublesome; " & processPath
End If
End If
If Not ExistInCol(m_Processes, newProcess.GetKey) Then
m_Processes.Add newProcess, newProcess.GetKey
Else
Debug.Print "Weird dublicate key:: " & newProcess.GetKey
End If
Set thisProcess = newProcess
Else
If thisProcess.WindowCount = 1 Then
If processPath <> "" And thisProcess.IsIconCreatedFromPath = False Then
thisProcess.CreateIconFromPath
End If
End If
If ProcessID <> 0 Then
thisProcess.Id = ProcessID
End If
End If
thisProcess.Running = True
Set newWindow = thisProcess.CreateWindow(hWnd)
If g_hwndForeGroundWindow = hWnd Then
Set m_ActiveWindow = newWindow
Set m_ActiveProcess = thisProcess
End If
thisProcess.AddWindow newWindow
End Function
Private Sub Class_Initialize()
Set m_Processes = New Collection
End Sub