6 * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
7 * 2005 Klemens Friedl <frik85@reactos.at>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 } APPLICATION_PAGE_LIST_ITEM
, *LPAPPLICATION_PAGE_LIST_ITEM
;
34 HWND hApplicationPage
; /* Application List Property Page */
35 HWND hApplicationPageListCtrl
; /* Application ListCtrl Window */
36 HWND hApplicationPageEndTaskButton
; /* Application End Task button */
37 HWND hApplicationPageSwitchToButton
; /* Application Switch To button */
38 HWND hApplicationPageNewTaskButton
; /* Application New Task button */
39 static int nApplicationPageWidth
;
40 static int nApplicationPageHeight
;
41 static HANDLE hApplicationPageEvent
= NULL
; /* When this event becomes signaled then we refresh the app list */
42 static BOOL bSortAscending
= TRUE
;
43 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
);
44 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
);
45 void AddOrUpdateHwnd(HWND hWnd
, TCHAR
*szTitle
, HICON hIcon
, BOOL bHung
);
46 void ApplicationPageUpdate(void);
47 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
);
48 void ApplicationPageShowContextMenu1(void);
49 void ApplicationPageShowContextMenu2(void);
50 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
);
51 int PerfGetIndexByProcessId(DWORD dwProcessId
);
54 void SwitchToThisWindow (
55 HWND hWnd
, /* Handle to the window that should be activated */
56 BOOL bRestore
/* Restore the window if it is minimized */
61 ApplicationPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
73 /* Save the width and height */
74 GetClientRect(hDlg
, &rc
);
75 nApplicationPageWidth
= rc
.right
;
76 nApplicationPageHeight
= rc
.bottom
;
78 /* Update window position */
79 SetWindowPos(hDlg
, NULL
, 15, 30, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
81 /* Get handles to the controls */
82 hApplicationPageListCtrl
= GetDlgItem(hDlg
, IDC_APPLIST
);
83 hApplicationPageEndTaskButton
= GetDlgItem(hDlg
, IDC_ENDTASK
);
84 hApplicationPageSwitchToButton
= GetDlgItem(hDlg
, IDC_SWITCHTO
);
85 hApplicationPageNewTaskButton
= GetDlgItem(hDlg
, IDC_NEWTASK
);
87 SetWindowText(hApplicationPageListCtrl
, _T("Tasks"));
89 /* Initialize the application page's controls */
90 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
92 LoadString(hInst
, IDS_TAB_TASK
, szTemp
, 256);
93 column
.pszText
= szTemp
;
95 ListView_InsertColumn(hApplicationPageListCtrl
, 0, &column
); /* Add the "Task" column */
96 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
97 LoadString(hInst
, IDS_TAB_STATUS
, szTemp
, 256);
98 column
.pszText
= szTemp
;
100 ListView_InsertColumn(hApplicationPageListCtrl
, 1, &column
); /* Add the "Status" column */
102 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(16, 16, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_SMALL
);
103 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(32, 32, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_NORMAL
);
105 UpdateApplicationListControlViewSetting();
107 /* Start our refresh thread */
108 CreateThread(NULL
, 0, ApplicationPageRefreshThread
, NULL
, 0, NULL
);
113 /* Close the event handle, this will make the */
114 /* refresh thread exit when the wait fails */
115 CloseHandle(hApplicationPageEvent
);
120 /* Handle the button clicks */
121 switch (LOWORD(wParam
))
124 ApplicationPage_OnEndTask();
127 ApplicationPage_OnSwitchTo();
130 SendMessage(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
137 if (wParam
== SIZE_MINIMIZED
)
142 nXDifference
= cx
- nApplicationPageWidth
;
143 nYDifference
= cy
- nApplicationPageHeight
;
144 nApplicationPageWidth
= cx
;
145 nApplicationPageHeight
= cy
;
147 /* Reposition the application page's controls */
148 GetWindowRect(hApplicationPageListCtrl
, &rc
);
149 cx
= (rc
.right
- rc
.left
) + nXDifference
;
150 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
151 SetWindowPos(hApplicationPageListCtrl
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
152 InvalidateRect(hApplicationPageListCtrl
, NULL
, TRUE
);
154 GetClientRect(hApplicationPageEndTaskButton
, &rc
);
155 MapWindowPoints(hApplicationPageEndTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
156 cx
= rc
.left
+ nXDifference
;
157 cy
= rc
.top
+ nYDifference
;
158 SetWindowPos(hApplicationPageEndTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
159 InvalidateRect(hApplicationPageEndTaskButton
, NULL
, TRUE
);
161 GetClientRect(hApplicationPageSwitchToButton
, &rc
);
162 MapWindowPoints(hApplicationPageSwitchToButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
163 cx
= rc
.left
+ nXDifference
;
164 cy
= rc
.top
+ nYDifference
;
165 SetWindowPos(hApplicationPageSwitchToButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
166 InvalidateRect(hApplicationPageSwitchToButton
, NULL
, TRUE
);
168 GetClientRect(hApplicationPageNewTaskButton
, &rc
);
169 MapWindowPoints(hApplicationPageNewTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
170 cx
= rc
.left
+ nXDifference
;
171 cy
= rc
.top
+ nYDifference
;
172 SetWindowPos(hApplicationPageNewTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
173 InvalidateRect(hApplicationPageNewTaskButton
, NULL
, TRUE
);
178 ApplicationPageOnNotify(wParam
, lParam
);
186 void RefreshApplicationPage(void)
188 /* Signal the event so that our refresh thread */
189 /* will wake up and refresh the application page */
190 SetEvent(hApplicationPageEvent
);
193 void UpdateApplicationListControlViewSetting(void)
195 DWORD dwStyle
= GetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
);
197 dwStyle
&= ~LVS_REPORT
;
198 dwStyle
&= ~LVS_ICON
;
199 dwStyle
&= ~LVS_LIST
;
200 dwStyle
&= ~LVS_SMALLICON
;
202 if (TaskManagerSettings
.View_LargeIcons
)
204 else if (TaskManagerSettings
.View_SmallIcons
)
205 dwStyle
|= LVS_SMALLICON
;
207 dwStyle
|= LVS_REPORT
;
209 SetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
211 RefreshApplicationPage();
214 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
)
216 /* Create the event */
217 hApplicationPageEvent
= CreateEvent(NULL
, TRUE
, TRUE
, NULL
);
219 /* If we couldn't create the event then exit the thread */
220 if (!hApplicationPageEvent
)
227 /* Wait on the event */
228 dwWaitVal
= WaitForSingleObject(hApplicationPageEvent
, INFINITE
);
230 /* If the wait failed then the event object must have been */
231 /* closed and the task manager is exiting so exit this thread */
232 if (dwWaitVal
== WAIT_FAILED
)
235 if (dwWaitVal
== WAIT_OBJECT_0
)
237 /* Reset our event */
238 ResetEvent(hApplicationPageEvent
);
243 * Should this be EnumDesktopWindows() instead?
245 EnumWindows(EnumWindowsProc
, 0);
250 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
256 HICON
* xhIcon
= (HICON
*)&hIcon
;
258 typedef int (FAR __stdcall
*IsHungAppWindowProc
)(HWND
);
259 IsHungAppWindowProc IsHungAppWindow
;
262 /* Skip our window */
263 if (hWnd
== hMainWnd
)
266 bLargeIcon
= TaskManagerSettings
.View_LargeIcons
? TRUE
: FALSE
;
268 GetWindowText(hWnd
, szText
, 260); /* Get the window text */
270 /* Check and see if this is a top-level app window */
271 if ((_tcslen(szText
) <= 0) ||
272 !IsWindowVisible(hWnd
) ||
273 (GetParent(hWnd
) != NULL
) ||
274 (GetWindow(hWnd
, GW_OWNER
) != NULL
) ||
275 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
277 return TRUE
; /* Skip this window */
280 /* Get the icon for this window */
282 SendMessageTimeout(hWnd
, WM_GETICON
,bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
286 hIcon
= (HICON
)GetClassLong(hWnd
, bLargeIcon
? GCL_HICON
: GCL_HICONSM
);
287 if (!hIcon
) hIcon
= (HICON
)GetClassLong(hWnd
, bLargeIcon
? GCL_HICONSM
: GCL_HICON
);
288 if (!hIcon
) SendMessageTimeout(hWnd
, WM_QUERYDRAGICON
, 0, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
289 if (!hIcon
) SendMessageTimeout(hWnd
, WM_GETICON
, bLargeIcon
? ICON_SMALL
/*0*/ : ICON_BIG
/*1*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
293 hIcon
= LoadIcon(hInst
, bLargeIcon
? MAKEINTRESOURCE(IDI_WINDOW
) : MAKEINTRESOURCE(IDI_WINDOWSM
));
297 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandle(_T("USER32.DLL")), "IsHungAppWindow");
300 bHung
= IsHungAppWindow(hWnd
);
302 AddOrUpdateHwnd(hWnd
, szText
, hIcon
, bHung
);
307 void AddOrUpdateHwnd(HWND hWnd
, TCHAR
*szTitle
, HICON hIcon
, BOOL bHung
)
309 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
310 HIMAGELIST hImageListLarge
;
311 HIMAGELIST hImageListSmall
;
314 BOOL bAlreadyInList
= FALSE
;
315 BOOL bItemRemoved
= FALSE
;
317 memset(&item
, 0, sizeof(LV_ITEM
));
319 /* Get the image lists */
320 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
321 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
323 /* Check to see if it's already in our list */
324 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
326 memset(&item
, 0, sizeof(LV_ITEM
));
327 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
329 ListView_GetItem(hApplicationPageListCtrl
, &item
);
331 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
332 if (pAPLI
->hWnd
== hWnd
)
334 bAlreadyInList
= TRUE
;
339 /* If it is already in the list then update it if necessary */
342 /* Check to see if anything needs updating */
343 if ((pAPLI
->hIcon
!= hIcon
) ||
344 (_tcsicmp(pAPLI
->szTitle
, szTitle
) != 0) ||
345 (pAPLI
->bHung
!= bHung
))
347 /* Update the structure */
348 pAPLI
->hIcon
= hIcon
;
349 pAPLI
->bHung
= bHung
;
350 _tcscpy(pAPLI
->szTitle
, szTitle
);
352 /* Update the image list */
353 ImageList_ReplaceIcon(hImageListLarge
, item
.iItem
, hIcon
);
354 ImageList_ReplaceIcon(hImageListSmall
, item
.iItem
, hIcon
);
356 /* Update the list view */
357 ListView_RedrawItems(hApplicationPageListCtrl
, 0, ListView_GetItemCount(hApplicationPageListCtrl
));
358 /* UpdateWindow(hApplicationPageListCtrl); */
359 InvalidateRect(hApplicationPageListCtrl
, NULL
, 0);
362 /* It is not already in the list so add it */
365 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM
));
368 pAPLI
->hIcon
= hIcon
;
369 pAPLI
->bHung
= bHung
;
370 _tcscpy(pAPLI
->szTitle
, szTitle
);
372 /* Add the item to the list */
373 memset(&item
, 0, sizeof(LV_ITEM
));
374 item
.mask
= LVIF_TEXT
|LVIF_IMAGE
|LVIF_PARAM
;
375 ImageList_AddIcon(hImageListLarge
, hIcon
);
376 item
.iImage
= ImageList_AddIcon(hImageListSmall
, hIcon
);
377 item
.pszText
= LPSTR_TEXTCALLBACK
;
378 item
.iItem
= ListView_GetItemCount(hApplicationPageListCtrl
);
379 item
.lParam
= (LPARAM
)pAPLI
;
380 ListView_InsertItem(hApplicationPageListCtrl
, &item
);
384 /* Check to see if we need to remove any items from the list */
385 for (i
=ListView_GetItemCount(hApplicationPageListCtrl
)-1; i
>=0; i
--)
387 memset(&item
, 0, sizeof(LV_ITEM
));
388 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
390 ListView_GetItem(hApplicationPageListCtrl
, &item
);
392 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
393 if (!IsWindow(pAPLI
->hWnd
)||
394 (_tcslen(pAPLI
->szTitle
) <= 0) ||
395 !IsWindowVisible(pAPLI
->hWnd
) ||
396 (GetParent(pAPLI
->hWnd
) != NULL
) ||
397 (GetWindow(pAPLI
->hWnd
, GW_OWNER
) != NULL
) ||
398 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
400 ImageList_Remove(hImageListLarge
, item
.iItem
);
401 ImageList_Remove(hImageListSmall
, item
.iItem
);
403 ListView_DeleteItem(hApplicationPageListCtrl
, item
.iItem
);
404 HeapFree(GetProcessHeap(), 0, pAPLI
);
410 * If an item was removed from the list then
411 * we need to resync all the items with the
416 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
418 memset(&item
, 0, sizeof(LV_ITEM
));
419 item
.mask
= LVIF_IMAGE
;
422 ListView_SetItem(hApplicationPageListCtrl
, &item
);
426 ApplicationPageUpdate();
429 void ApplicationPageUpdate(void)
431 /* Enable or disable the "End Task" & "Switch To" buttons */
432 if (ListView_GetSelectedCount(hApplicationPageListCtrl
))
434 EnableWindow(hApplicationPageEndTaskButton
, TRUE
);
435 EnableWindow(hApplicationPageSwitchToButton
, TRUE
);
439 EnableWindow(hApplicationPageEndTaskButton
, FALSE
);
440 EnableWindow(hApplicationPageSwitchToButton
, FALSE
);
443 /* If we are on the applications tab the the windows menu will */
444 /* be present on the menu bar so enable & disable the menu items */
445 if (TabCtrl_GetCurSel(hTabWnd
) == 0)
450 hMenu
= GetMenu(hMainWnd
);
451 hWindowsMenu
= GetSubMenu(hMenu
, 3);
453 /* Only one item selected */
454 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
456 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
457 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
458 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
459 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
460 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
461 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
463 /* More than one item selected */
464 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
466 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
467 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
468 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
469 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
470 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
471 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
473 /* No items selected */
476 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
477 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
478 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
479 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
480 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
481 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
486 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
)
492 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
;
496 idctrl
= (int) wParam
;
497 pnmh
= (LPNMHDR
) lParam
;
498 pnmv
= (LPNM_LISTVIEW
) lParam
;
499 pnmdi
= (LV_DISPINFO
*) lParam
;
501 if (pnmh
->hwndFrom
== hApplicationPageListCtrl
) {
502 switch (pnmh
->code
) {
503 case LVN_ITEMCHANGED
:
504 ApplicationPageUpdate();
507 case LVN_GETDISPINFO
:
508 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)pnmdi
->item
.lParam
;
510 /* Update the item text */
511 if (pnmdi
->item
.iSubItem
== 0)
513 _tcsncpy(pnmdi
->item
.pszText
, pAPLI
->szTitle
, pnmdi
->item
.cchTextMax
);
516 /* Update the item status */
517 else if (pnmdi
->item
.iSubItem
== 1)
521 LoadString( GetModuleHandle(NULL
), IDS_Not_Responding
, szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
522 _tcsncpy(pnmdi
->item
.pszText
, szMsg
, pnmdi
->item
.cchTextMax
);
526 LoadString( GetModuleHandle(NULL
), IDS_Running
, (LPTSTR
) szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
527 _tcsncpy(pnmdi
->item
.pszText
, szMsg
, pnmdi
->item
.cchTextMax
);
535 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
537 ApplicationPageShowContextMenu1();
541 ApplicationPageShowContextMenu2();
548 ApplicationPage_OnSwitchTo();
553 else if (pnmh
->hwndFrom
== ListView_GetHeader(hApplicationPageListCtrl
))
559 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
561 ApplicationPageShowContextMenu1();
565 ApplicationPageShowContextMenu2();
572 ListView_SortItems(hApplicationPageListCtrl
, ApplicationPageCompareFunc
, 0);
573 bSortAscending
= !bSortAscending
;
581 void ApplicationPageShowContextMenu1(void)
589 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT1
));
590 hSubMenu
= GetSubMenu(hMenu
, 0);
592 if (TaskManagerSettings
.View_LargeIcons
)
593 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
594 else if (TaskManagerSettings
.View_SmallIcons
)
595 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
597 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
599 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
604 void ApplicationPageShowContextMenu2(void)
612 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT2
));
613 hSubMenu
= GetSubMenu(hMenu
, 0);
615 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
617 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
618 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
619 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
620 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
621 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
622 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
624 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
626 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
627 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
628 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
629 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
630 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
631 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
635 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
636 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
637 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
638 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
639 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
640 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
643 SetMenuDefaultItem(hSubMenu
, ID_APPLICATION_PAGE_SWITCHTO
, MF_BYCOMMAND
);
645 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
650 void ApplicationPage_OnViewLargeIcons(void)
655 hMenu
= GetMenu(hMainWnd
);
656 hViewMenu
= GetSubMenu(hMenu
, 2);
658 TaskManagerSettings
.View_LargeIcons
= TRUE
;
659 TaskManagerSettings
.View_SmallIcons
= FALSE
;
660 TaskManagerSettings
.View_Details
= FALSE
;
661 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
663 UpdateApplicationListControlViewSetting();
666 void ApplicationPage_OnViewSmallIcons(void)
671 hMenu
= GetMenu(hMainWnd
);
672 hViewMenu
= GetSubMenu(hMenu
, 2);
674 TaskManagerSettings
.View_LargeIcons
= FALSE
;
675 TaskManagerSettings
.View_SmallIcons
= TRUE
;
676 TaskManagerSettings
.View_Details
= FALSE
;
677 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
679 UpdateApplicationListControlViewSetting();
682 void ApplicationPage_OnViewDetails(void)
687 hMenu
= GetMenu(hMainWnd
);
688 hViewMenu
= GetSubMenu(hMenu
, 2);
690 TaskManagerSettings
.View_LargeIcons
= FALSE
;
691 TaskManagerSettings
.View_SmallIcons
= FALSE
;
692 TaskManagerSettings
.View_Details
= TRUE
;
693 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
695 UpdateApplicationListControlViewSetting();
698 void ApplicationPage_OnWindowsTileHorizontally(void)
700 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
706 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
709 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
710 memset(&item
, 0, sizeof(LV_ITEM
));
711 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
713 item
.stateMask
= (UINT
)-1;
714 ListView_GetItem(hApplicationPageListCtrl
, &item
);
716 if (item
.state
& LVIS_SELECTED
) {
717 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
720 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
725 TileWindows(NULL
, MDITILE_HORIZONTAL
, NULL
, nWndCount
, hWndArray
);
726 HeapFree(GetProcessHeap(), 0, hWndArray
);
729 void ApplicationPage_OnWindowsTileVertically(void)
731 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
737 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
740 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
741 memset(&item
, 0, sizeof(LV_ITEM
));
742 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
744 item
.stateMask
= (UINT
)-1;
745 ListView_GetItem(hApplicationPageListCtrl
, &item
);
747 if (item
.state
& LVIS_SELECTED
) {
748 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
750 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
756 TileWindows(NULL
, MDITILE_VERTICAL
, NULL
, nWndCount
, hWndArray
);
757 HeapFree(GetProcessHeap(), 0, hWndArray
);
760 void ApplicationPage_OnWindowsMinimize(void)
762 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
766 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
767 memset(&item
, 0, sizeof(LV_ITEM
));
768 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
770 item
.stateMask
= (UINT
)-1;
771 ListView_GetItem(hApplicationPageListCtrl
, &item
);
772 if (item
.state
& LVIS_SELECTED
) {
773 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
775 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
781 void ApplicationPage_OnWindowsMaximize(void)
783 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
787 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
788 memset(&item
, 0, sizeof(LV_ITEM
));
789 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
791 item
.stateMask
= (UINT
)-1;
792 ListView_GetItem(hApplicationPageListCtrl
, &item
);
793 if (item
.state
& LVIS_SELECTED
) {
794 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
796 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
802 void ApplicationPage_OnWindowsCascade(void)
804 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
810 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
813 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
814 memset(&item
, 0, sizeof(LV_ITEM
));
815 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
817 item
.stateMask
= (UINT
)-1;
818 ListView_GetItem(hApplicationPageListCtrl
, &item
);
819 if (item
.state
& LVIS_SELECTED
) {
820 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
822 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
827 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
828 HeapFree(GetProcessHeap(), 0, hWndArray
);
831 void ApplicationPage_OnWindowsBringToFront(void)
833 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
837 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
838 memset(&item
, 0, sizeof(LV_ITEM
));
839 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
841 item
.stateMask
= (UINT
)-1;
842 ListView_GetItem(hApplicationPageListCtrl
, &item
);
843 if (item
.state
& LVIS_SELECTED
) {
844 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
849 if (IsIconic(pAPLI
->hWnd
))
850 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
851 BringWindowToTop(pAPLI
->hWnd
);
855 void ApplicationPage_OnSwitchTo(void)
857 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
861 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
862 memset(&item
, 0, sizeof(LV_ITEM
));
863 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
865 item
.stateMask
= (UINT
)-1;
866 ListView_GetItem(hApplicationPageListCtrl
, &item
);
868 if (item
.state
& LVIS_SELECTED
) {
869 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
874 typedef void (WINAPI
*PROCSWITCHTOTHISWINDOW
) (HWND
, BOOL
);
875 PROCSWITCHTOTHISWINDOW SwitchToThisWindow
;
877 HMODULE hUser32
= GetModuleHandle(_T("USER32"));
878 SwitchToThisWindow
= (PROCSWITCHTOTHISWINDOW
)GetProcAddress(hUser32
, "SwitchToThisWindow");
879 if (SwitchToThisWindow
) {
880 SwitchToThisWindow(pAPLI
->hWnd
, TRUE
);
882 if (IsIconic(pAPLI
->hWnd
))
883 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
884 BringWindowToTop(pAPLI
->hWnd
);
885 SetForegroundWindow(pAPLI
->hWnd
);
887 if (TaskManagerSettings
.MinimizeOnUse
)
888 ShowWindow(hMainWnd
, SW_MINIMIZE
);
892 void ApplicationPage_OnEndTask(void)
894 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
898 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
899 memset(&item
, 0, sizeof(LV_ITEM
));
900 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
902 item
.stateMask
= (UINT
)-1;
903 ListView_GetItem(hApplicationPageListCtrl
, &item
);
904 if (item
.state
& LVIS_SELECTED
) {
905 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
907 PostMessage(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
913 void ApplicationPage_OnGotoProcess(void)
915 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
920 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
921 memset(&item
, 0, sizeof(LV_ITEM
));
922 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
924 item
.stateMask
= (UINT
)-1;
925 ListView_GetItem(hApplicationPageListCtrl
, &item
);
926 if (item
.state
& LVIS_SELECTED
) {
927 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
934 GetWindowThreadProcessId(pAPLI
->hWnd
, &dwProcessId
);
936 * Switch to the process tab
938 TabCtrl_SetCurFocus(hTabWnd
, 1);
940 * Select the process item in the list
942 i
= PerfGetIndexByProcessId(dwProcessId
);
945 ListView_SetItemState(hProcessPageListCtrl
,
947 LVIS_SELECTED
| LVIS_FOCUSED
,
948 LVIS_SELECTED
| LVIS_FOCUSED
);
949 ListView_EnsureVisible(hProcessPageListCtrl
,
956 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
958 LPAPPLICATION_PAGE_LIST_ITEM Param1
;
959 LPAPPLICATION_PAGE_LIST_ITEM Param2
;
961 if (bSortAscending
) {
962 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
963 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
965 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
966 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
968 return _tcscmp(Param1
->szTitle
, Param2
->szTitle
);