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
, WCHAR
*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
)
69 HANDLE hRefreshThread
= NULL
;
74 /* Save the width and height */
75 GetClientRect(hDlg
, &rc
);
76 nApplicationPageWidth
= rc
.right
;
77 nApplicationPageHeight
= rc
.bottom
;
79 /* Update window position */
80 SetWindowPos(hDlg
, NULL
, 15, 30, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
82 /* Get handles to the controls */
83 hApplicationPageListCtrl
= GetDlgItem(hDlg
, IDC_APPLIST
);
84 hApplicationPageEndTaskButton
= GetDlgItem(hDlg
, IDC_ENDTASK
);
85 hApplicationPageSwitchToButton
= GetDlgItem(hDlg
, IDC_SWITCHTO
);
86 hApplicationPageNewTaskButton
= GetDlgItem(hDlg
, IDC_NEWTASK
);
88 SetWindowTextW(hApplicationPageListCtrl
, L
"Tasks");
90 /* Initialize the application page's controls */
91 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
93 LoadStringW(hInst
, IDS_TAB_TASK
, szTemp
, 256);
94 column
.pszText
= szTemp
;
96 (void)ListView_InsertColumn(hApplicationPageListCtrl
, 0, &column
); /* Add the "Task" column */
97 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
98 LoadStringW(hInst
, IDS_TAB_STATUS
, szTemp
, 256);
99 column
.pszText
= szTemp
;
101 (void)ListView_InsertColumn(hApplicationPageListCtrl
, 1, &column
); /* Add the "Status" column */
103 (void)ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(16, 16, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_SMALL
);
104 (void)ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(32, 32, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_NORMAL
);
106 UpdateApplicationListControlViewSetting();
108 /* Start our refresh thread */
109 hRefreshThread
= CreateThread(NULL
, 0, ApplicationPageRefreshThread
, NULL
, 0, NULL
);
114 /* Close the event handle, this will make the */
115 /* refresh thread exit when the wait fails */
116 CloseHandle(hApplicationPageEvent
);
117 CloseHandle(hRefreshThread
);
122 /* Handle the button clicks */
123 switch (LOWORD(wParam
))
126 ApplicationPage_OnEndTask();
129 ApplicationPage_OnSwitchTo();
132 SendMessageW(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
139 if (wParam
== SIZE_MINIMIZED
)
144 nXDifference
= cx
- nApplicationPageWidth
;
145 nYDifference
= cy
- nApplicationPageHeight
;
146 nApplicationPageWidth
= cx
;
147 nApplicationPageHeight
= cy
;
149 /* Reposition the application page's controls */
150 GetWindowRect(hApplicationPageListCtrl
, &rc
);
151 cx
= (rc
.right
- rc
.left
) + nXDifference
;
152 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
153 SetWindowPos(hApplicationPageListCtrl
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
154 InvalidateRect(hApplicationPageListCtrl
, NULL
, TRUE
);
156 GetClientRect(hApplicationPageEndTaskButton
, &rc
);
157 MapWindowPoints(hApplicationPageEndTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
158 cx
= rc
.left
+ nXDifference
;
159 cy
= rc
.top
+ nYDifference
;
160 SetWindowPos(hApplicationPageEndTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
161 InvalidateRect(hApplicationPageEndTaskButton
, NULL
, TRUE
);
163 GetClientRect(hApplicationPageSwitchToButton
, &rc
);
164 MapWindowPoints(hApplicationPageSwitchToButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
165 cx
= rc
.left
+ nXDifference
;
166 cy
= rc
.top
+ nYDifference
;
167 SetWindowPos(hApplicationPageSwitchToButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
168 InvalidateRect(hApplicationPageSwitchToButton
, NULL
, TRUE
);
170 GetClientRect(hApplicationPageNewTaskButton
, &rc
);
171 MapWindowPoints(hApplicationPageNewTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
172 cx
= rc
.left
+ nXDifference
;
173 cy
= rc
.top
+ nYDifference
;
174 SetWindowPos(hApplicationPageNewTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
175 InvalidateRect(hApplicationPageNewTaskButton
, NULL
, TRUE
);
180 ApplicationPageOnNotify(wParam
, lParam
);
188 void RefreshApplicationPage(void)
190 /* Signal the event so that our refresh thread */
191 /* will wake up and refresh the application page */
192 SetEvent(hApplicationPageEvent
);
195 void UpdateApplicationListControlViewSetting(void)
197 DWORD dwStyle
= GetWindowLongW(hApplicationPageListCtrl
, GWL_STYLE
);
199 dwStyle
&= ~(LVS_REPORT
| LVS_ICON
| LVS_LIST
| LVS_SMALLICON
);
201 switch (TaskManagerSettings
.ViewMode
) {
202 case ID_VIEW_LARGE
: dwStyle
|= LVS_ICON
; break;
203 case ID_VIEW_SMALL
: dwStyle
|= LVS_SMALLICON
; break;
204 case ID_VIEW_DETAILS
: dwStyle
|= LVS_REPORT
; break;
206 SetWindowLongW(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
208 RefreshApplicationPage();
211 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
)
213 /* Create the event */
214 hApplicationPageEvent
= CreateEventW(NULL
, TRUE
, TRUE
, NULL
);
216 /* If we couldn't create the event then exit the thread */
217 if (!hApplicationPageEvent
)
224 /* Wait on the event */
225 dwWaitVal
= WaitForSingleObject(hApplicationPageEvent
, INFINITE
);
227 /* If the wait failed then the event object must have been */
228 /* closed and the task manager is exiting so exit this thread */
229 if (dwWaitVal
== WAIT_FAILED
)
232 if (dwWaitVal
== WAIT_OBJECT_0
)
234 /* Reset our event */
235 ResetEvent(hApplicationPageEvent
);
240 * Should this be EnumDesktopWindows() instead?
242 EnumWindows(EnumWindowsProc
, 0);
247 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
253 HICON
* xhIcon
= (HICON
*)&hIcon
;
255 typedef int (FAR __stdcall
*IsHungAppWindowProc
)(HWND
);
256 IsHungAppWindowProc IsHungAppWindow
;
259 /* Skip our window */
260 if (hWnd
== hMainWnd
)
263 bLargeIcon
= (TaskManagerSettings
.ViewMode
== ID_VIEW_LARGE
);
265 GetWindowTextW(hWnd
, szText
, 260); /* Get the window text */
267 /* Check and see if this is a top-level app window */
268 if ((wcslen(szText
) <= 0) ||
269 !IsWindowVisible(hWnd
) ||
270 (GetParent(hWnd
) != NULL
) ||
271 (GetWindow(hWnd
, GW_OWNER
) != NULL
) ||
272 (GetWindowLongW(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
274 return TRUE
; /* Skip this window */
277 /* Get the icon for this window */
279 SendMessageTimeoutW(hWnd
, WM_GETICON
,bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
283 hIcon
= (HICON
)(LONG_PTR
)GetClassLongPtrW(hWnd
, bLargeIcon
? GCL_HICON
: GCL_HICONSM
);
284 if (!hIcon
) hIcon
= (HICON
)(LONG_PTR
)GetClassLongPtrW(hWnd
, bLargeIcon
? GCL_HICONSM
: GCL_HICON
);
285 if (!hIcon
) SendMessageTimeoutW(hWnd
, WM_QUERYDRAGICON
, 0, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
286 if (!hIcon
) SendMessageTimeoutW(hWnd
, WM_GETICON
, bLargeIcon
? ICON_SMALL
/*0*/ : ICON_BIG
/*1*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
290 hIcon
= LoadIconW(hInst
, bLargeIcon
? MAKEINTRESOURCEW(IDI_WINDOW
) : MAKEINTRESOURCEW(IDI_WINDOWSM
));
294 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandleW(L
"USER32.DLL"), "IsHungAppWindow");
297 bHung
= IsHungAppWindow(hWnd
);
299 AddOrUpdateHwnd(hWnd
, szText
, hIcon
, bHung
);
304 void AddOrUpdateHwnd(HWND hWnd
, WCHAR
*szTitle
, HICON hIcon
, BOOL bHung
)
306 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
307 HIMAGELIST hImageListLarge
;
308 HIMAGELIST hImageListSmall
;
311 BOOL bAlreadyInList
= FALSE
;
312 BOOL bItemRemoved
= FALSE
;
314 memset(&item
, 0, sizeof(LV_ITEM
));
316 /* Get the image lists */
317 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
318 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
320 /* Check to see if it's already in our list */
321 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
323 memset(&item
, 0, sizeof(LV_ITEM
));
324 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
326 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
328 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
329 if (pAPLI
->hWnd
== hWnd
)
331 bAlreadyInList
= TRUE
;
336 /* If it is already in the list then update it if necessary */
339 /* Check to see if anything needs updating */
340 if ((pAPLI
->hIcon
!= hIcon
) ||
341 (_wcsicmp(pAPLI
->szTitle
, szTitle
) != 0) ||
342 (pAPLI
->bHung
!= bHung
))
344 /* Update the structure */
345 pAPLI
->hIcon
= hIcon
;
346 pAPLI
->bHung
= bHung
;
347 wcscpy(pAPLI
->szTitle
, szTitle
);
349 /* Update the image list */
350 ImageList_ReplaceIcon(hImageListLarge
, item
.iItem
, hIcon
);
351 ImageList_ReplaceIcon(hImageListSmall
, item
.iItem
, hIcon
);
353 /* Update the list view */
354 (void)ListView_RedrawItems(hApplicationPageListCtrl
, 0, ListView_GetItemCount(hApplicationPageListCtrl
));
355 /* UpdateWindow(hApplicationPageListCtrl); */
356 InvalidateRect(hApplicationPageListCtrl
, NULL
, 0);
359 /* It is not already in the list so add it */
362 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM
));
365 pAPLI
->hIcon
= hIcon
;
366 pAPLI
->bHung
= bHung
;
367 wcscpy(pAPLI
->szTitle
, szTitle
);
369 /* Add the item to the list */
370 memset(&item
, 0, sizeof(LV_ITEM
));
371 item
.mask
= LVIF_TEXT
|LVIF_IMAGE
|LVIF_PARAM
;
372 ImageList_AddIcon(hImageListLarge
, hIcon
);
373 item
.iImage
= ImageList_AddIcon(hImageListSmall
, hIcon
);
374 item
.pszText
= LPSTR_TEXTCALLBACK
;
375 item
.iItem
= ListView_GetItemCount(hApplicationPageListCtrl
);
376 item
.lParam
= (LPARAM
)pAPLI
;
377 (void)ListView_InsertItem(hApplicationPageListCtrl
, &item
);
381 /* Check to see if we need to remove any items from the list */
382 for (i
=ListView_GetItemCount(hApplicationPageListCtrl
)-1; i
>=0; i
--)
384 memset(&item
, 0, sizeof(LV_ITEM
));
385 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
387 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
389 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
390 if (!IsWindow(pAPLI
->hWnd
)||
391 (wcslen(pAPLI
->szTitle
) <= 0) ||
392 !IsWindowVisible(pAPLI
->hWnd
) ||
393 (GetParent(pAPLI
->hWnd
) != NULL
) ||
394 (GetWindow(pAPLI
->hWnd
, GW_OWNER
) != NULL
) ||
395 (GetWindowLongW(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
397 ImageList_Remove(hImageListLarge
, item
.iItem
);
398 ImageList_Remove(hImageListSmall
, item
.iItem
);
400 (void)ListView_DeleteItem(hApplicationPageListCtrl
, item
.iItem
);
401 HeapFree(GetProcessHeap(), 0, pAPLI
);
407 * If an item was removed from the list then
408 * we need to resync all the items with the
413 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
415 memset(&item
, 0, sizeof(LV_ITEM
));
416 item
.mask
= LVIF_IMAGE
;
419 (void)ListView_SetItem(hApplicationPageListCtrl
, &item
);
423 ApplicationPageUpdate();
426 void ApplicationPageUpdate(void)
428 /* Enable or disable the "End Task" & "Switch To" buttons */
429 if (ListView_GetSelectedCount(hApplicationPageListCtrl
))
431 EnableWindow(hApplicationPageEndTaskButton
, TRUE
);
432 EnableWindow(hApplicationPageSwitchToButton
, TRUE
);
436 EnableWindow(hApplicationPageEndTaskButton
, FALSE
);
437 EnableWindow(hApplicationPageSwitchToButton
, FALSE
);
440 /* If we are on the applications tab the the windows menu will */
441 /* be present on the menu bar so enable & disable the menu items */
442 if (TabCtrl_GetCurSel(hTabWnd
) == 0)
447 hMenu
= GetMenu(hMainWnd
);
448 hWindowsMenu
= GetSubMenu(hMenu
, 3);
450 /* Only one item selected */
451 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
453 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
454 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
455 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
456 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
457 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
458 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
460 /* More than one item selected */
461 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
463 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
464 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
465 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
466 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
467 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
468 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
470 /* No items selected */
473 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
474 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
475 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
476 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
477 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
478 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
483 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
)
489 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
;
493 idctrl
= (int) wParam
;
494 pnmh
= (LPNMHDR
) lParam
;
495 pnmv
= (LPNM_LISTVIEW
) lParam
;
496 pnmdi
= (LV_DISPINFO
*) lParam
;
498 if (pnmh
->hwndFrom
== hApplicationPageListCtrl
) {
499 switch (pnmh
->code
) {
500 case LVN_ITEMCHANGED
:
501 ApplicationPageUpdate();
504 case LVN_GETDISPINFO
:
505 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)pnmdi
->item
.lParam
;
507 /* Update the item text */
508 if (pnmdi
->item
.iSubItem
== 0)
510 wcsncpy(pnmdi
->item
.pszText
, pAPLI
->szTitle
, pnmdi
->item
.cchTextMax
);
513 /* Update the item status */
514 else if (pnmdi
->item
.iSubItem
== 1)
518 LoadStringW( GetModuleHandleW(NULL
), IDS_Not_Responding
, szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
522 LoadStringW( GetModuleHandleW(NULL
), IDS_Running
, (LPWSTR
) szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
524 wcsncpy(pnmdi
->item
.pszText
, szMsg
, pnmdi
->item
.cchTextMax
);
531 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
533 ApplicationPageShowContextMenu1();
537 ApplicationPageShowContextMenu2();
544 ApplicationPage_OnSwitchTo();
549 else if (pnmh
->hwndFrom
== ListView_GetHeader(hApplicationPageListCtrl
))
555 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
557 ApplicationPageShowContextMenu1();
561 ApplicationPageShowContextMenu2();
568 (void)ListView_SortItems(hApplicationPageListCtrl
, ApplicationPageCompareFunc
, 0);
569 bSortAscending
= !bSortAscending
;
577 void ApplicationPageShowContextMenu1(void)
585 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT1
));
586 hSubMenu
= GetSubMenu(hMenu
, 0);
588 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, TaskManagerSettings
.ViewMode
, MF_BYCOMMAND
);
590 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
595 void ApplicationPageShowContextMenu2(void)
603 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT2
));
604 hSubMenu
= GetSubMenu(hMenu
, 0);
606 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
608 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
609 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
610 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
611 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
612 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
613 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
615 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
617 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
618 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
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_ENABLED
);
622 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
626 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
627 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
628 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
629 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
630 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
631 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
634 SetMenuDefaultItem(hSubMenu
, ID_APPLICATION_PAGE_SWITCHTO
, MF_BYCOMMAND
);
636 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
641 void ApplicationPage_OnView(DWORD dwMode
)
646 hMenu
= GetMenu(hMainWnd
);
647 hViewMenu
= GetSubMenu(hMenu
, 2);
649 TaskManagerSettings
.ViewMode
= dwMode
;
650 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, dwMode
, MF_BYCOMMAND
);
652 UpdateApplicationListControlViewSetting();
655 void ApplicationPage_OnWindowsTile(DWORD dwMode
)
657 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
663 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
666 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
667 memset(&item
, 0, sizeof(LV_ITEM
));
668 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
670 item
.stateMask
= (UINT
)-1;
671 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
673 if (item
.state
& LVIS_SELECTED
) {
674 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
676 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
682 TileWindows(NULL
, dwMode
, NULL
, nWndCount
, hWndArray
);
683 HeapFree(GetProcessHeap(), 0, hWndArray
);
686 void ApplicationPage_OnWindowsMinimize(void)
688 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
692 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
693 memset(&item
, 0, sizeof(LV_ITEM
));
694 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
696 item
.stateMask
= (UINT
)-1;
697 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
698 if (item
.state
& LVIS_SELECTED
) {
699 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
701 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
707 void ApplicationPage_OnWindowsMaximize(void)
709 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
713 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
714 memset(&item
, 0, sizeof(LV_ITEM
));
715 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
717 item
.stateMask
= (UINT
)-1;
718 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
719 if (item
.state
& LVIS_SELECTED
) {
720 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
722 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
728 void ApplicationPage_OnWindowsCascade(void)
730 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
736 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
739 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
740 memset(&item
, 0, sizeof(LV_ITEM
));
741 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
743 item
.stateMask
= (UINT
)-1;
744 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
745 if (item
.state
& LVIS_SELECTED
) {
746 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
748 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
753 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
754 HeapFree(GetProcessHeap(), 0, hWndArray
);
757 void ApplicationPage_OnWindowsBringToFront(void)
759 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
763 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
764 memset(&item
, 0, sizeof(LV_ITEM
));
765 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
767 item
.stateMask
= (UINT
)-1;
768 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
769 if (item
.state
& LVIS_SELECTED
) {
770 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
775 if (IsIconic(pAPLI
->hWnd
))
776 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
777 BringWindowToTop(pAPLI
->hWnd
);
781 void ApplicationPage_OnSwitchTo(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 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
794 if (item
.state
& LVIS_SELECTED
) {
795 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
800 typedef void (WINAPI
*PROCSWITCHTOTHISWINDOW
) (HWND
, BOOL
);
801 PROCSWITCHTOTHISWINDOW SwitchToThisWindow
;
803 HMODULE hUser32
= GetModuleHandleW(L
"USER32");
804 SwitchToThisWindow
= (PROCSWITCHTOTHISWINDOW
)GetProcAddress(hUser32
, "SwitchToThisWindow");
805 if (SwitchToThisWindow
) {
806 SwitchToThisWindow(pAPLI
->hWnd
, TRUE
);
808 if (IsIconic(pAPLI
->hWnd
))
809 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
810 BringWindowToTop(pAPLI
->hWnd
);
811 SetForegroundWindow(pAPLI
->hWnd
);
813 if (TaskManagerSettings
.MinimizeOnUse
)
814 ShowWindow(hMainWnd
, SW_MINIMIZE
);
818 void ApplicationPage_OnEndTask(void)
820 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
824 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
825 memset(&item
, 0, sizeof(LV_ITEM
));
826 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
828 item
.stateMask
= (UINT
)-1;
829 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
830 if (item
.state
& LVIS_SELECTED
) {
831 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
833 PostMessageW(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
839 void ApplicationPage_OnGotoProcess(void)
841 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
846 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
847 memset(&item
, 0, sizeof(LV_ITEM
));
848 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
850 item
.stateMask
= (UINT
)-1;
851 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
852 if (item
.state
& LVIS_SELECTED
) {
853 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
860 GetWindowThreadProcessId(pAPLI
->hWnd
, &dwProcessId
);
862 * Switch to the process tab
864 TabCtrl_SetCurFocus(hTabWnd
, 1);
866 * Select the process item in the list
868 i
= PerfGetIndexByProcessId(dwProcessId
);
871 ListView_SetItemState(hProcessPageListCtrl
,
873 LVIS_SELECTED
| LVIS_FOCUSED
,
874 LVIS_SELECTED
| LVIS_FOCUSED
);
875 (void)ListView_EnsureVisible(hProcessPageListCtrl
,
882 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
884 LPAPPLICATION_PAGE_LIST_ITEM Param1
;
885 LPAPPLICATION_PAGE_LIST_ITEM Param2
;
887 if (bSortAscending
) {
888 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
889 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
891 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
892 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
894 return wcscmp(Param1
->szTitle
, Param2
->szTitle
);