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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 BOOL bSortAscending
= TRUE
;
42 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 ProcGetIndexByProcessId(DWORD dwProcessId
);
54 static HANDLE hApplicationThread
= NULL
;
55 static DWORD dwApplicationThread
;
59 void SwitchToThisWindow (
60 HWND hWnd
, /* Handle to the window that should be activated */
61 BOOL bRestore
/* Restore the window if it is minimized */
66 GetSystemColorDepth(VOID
)
71 pDevMode
.dmSize
= sizeof(DEVMODE
);
72 pDevMode
.dmDriverExtra
= 0;
74 if (!EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &pDevMode
))
77 switch (pDevMode
.dmBitsPerPel
)
79 case 32: ColorDepth
= ILC_COLOR32
; break;
80 case 24: ColorDepth
= ILC_COLOR24
; break;
81 case 16: ColorDepth
= ILC_COLOR16
; break;
82 case 8: ColorDepth
= ILC_COLOR8
; break;
83 case 4: ColorDepth
= ILC_COLOR4
; break;
84 default: ColorDepth
= ILC_COLOR
; break;
91 ApplicationPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
103 /* Save the width and height */
104 GetClientRect(hDlg
, &rc
);
105 nApplicationPageWidth
= rc
.right
;
106 nApplicationPageHeight
= rc
.bottom
;
108 /* Update window position */
109 SetWindowPos(hDlg
, NULL
, 15, 30, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
111 /* Get handles to the controls */
112 hApplicationPageListCtrl
= GetDlgItem(hDlg
, IDC_APPLIST
);
113 hApplicationPageEndTaskButton
= GetDlgItem(hDlg
, IDC_ENDTASK
);
114 hApplicationPageSwitchToButton
= GetDlgItem(hDlg
, IDC_SWITCHTO
);
115 hApplicationPageNewTaskButton
= GetDlgItem(hDlg
, IDC_NEWTASK
);
117 SetWindowTextW(hApplicationPageListCtrl
, L
"Tasks");
119 /* Initialize the application page's controls */
120 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
122 LoadStringW(hInst
, IDS_TAB_TASK
, szTemp
, 256);
123 column
.pszText
= szTemp
;
125 (void)ListView_InsertColumn(hApplicationPageListCtrl
, 0, &column
); /* Add the "Task" column */
126 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
127 LoadStringW(hInst
, IDS_TAB_STATUS
, szTemp
, 256);
128 column
.pszText
= szTemp
;
130 (void)ListView_InsertColumn(hApplicationPageListCtrl
, 1, &column
); /* Add the "Status" column */
132 (void)ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(16, 16, GetSystemColorDepth()|ILC_MASK
, 0, 1), LVSIL_SMALL
);
133 (void)ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(32, 32, GetSystemColorDepth()|ILC_MASK
, 0, 1), LVSIL_NORMAL
);
135 UpdateApplicationListControlViewSetting();
137 /* Start our refresh thread */
139 hApplicationThread
= CreateThread(NULL
, 0, ApplicationPageRefreshThread
, NULL
, 0, &dwApplicationThread
);
144 /* Close refresh thread */
146 EndLocalThread(&hApplicationThread
, dwApplicationThread
);
152 /* Handle the button clicks */
153 switch (LOWORD(wParam
))
156 ApplicationPage_OnEndTask();
159 ApplicationPage_OnSwitchTo();
162 SendMessageW(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
169 if (wParam
== SIZE_MINIMIZED
)
174 nXDifference
= cx
- nApplicationPageWidth
;
175 nYDifference
= cy
- nApplicationPageHeight
;
176 nApplicationPageWidth
= cx
;
177 nApplicationPageHeight
= cy
;
179 /* Reposition the application page's controls */
180 GetWindowRect(hApplicationPageListCtrl
, &rc
);
181 cx
= (rc
.right
- rc
.left
) + nXDifference
;
182 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
183 SetWindowPos(hApplicationPageListCtrl
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
184 InvalidateRect(hApplicationPageListCtrl
, NULL
, TRUE
);
186 GetClientRect(hApplicationPageEndTaskButton
, &rc
);
187 MapWindowPoints(hApplicationPageEndTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
188 cx
= rc
.left
+ nXDifference
;
189 cy
= rc
.top
+ nYDifference
;
190 SetWindowPos(hApplicationPageEndTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
191 InvalidateRect(hApplicationPageEndTaskButton
, NULL
, TRUE
);
193 GetClientRect(hApplicationPageSwitchToButton
, &rc
);
194 MapWindowPoints(hApplicationPageSwitchToButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
195 cx
= rc
.left
+ nXDifference
;
196 cy
= rc
.top
+ nYDifference
;
197 SetWindowPos(hApplicationPageSwitchToButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
198 InvalidateRect(hApplicationPageSwitchToButton
, NULL
, TRUE
);
200 GetClientRect(hApplicationPageNewTaskButton
, &rc
);
201 MapWindowPoints(hApplicationPageNewTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
202 cx
= rc
.left
+ nXDifference
;
203 cy
= rc
.top
+ nYDifference
;
204 SetWindowPos(hApplicationPageNewTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
205 InvalidateRect(hApplicationPageNewTaskButton
, NULL
, TRUE
);
210 ApplicationPageOnNotify(wParam
, lParam
);
218 void RefreshApplicationPage(void)
221 /* Signal the event so that our refresh thread */
222 /* will wake up and refresh the application page */
223 PostThreadMessage(dwApplicationThread
, WM_TIMER
, 0, 0);
227 void UpdateApplicationListControlViewSetting(void)
229 DWORD dwStyle
= GetWindowLongPtrW(hApplicationPageListCtrl
, GWL_STYLE
);
231 dwStyle
&= ~(LVS_REPORT
| LVS_ICON
| LVS_LIST
| LVS_SMALLICON
);
233 switch (TaskManagerSettings
.ViewMode
) {
234 case ID_VIEW_LARGE
: dwStyle
|= LVS_ICON
; break;
235 case ID_VIEW_SMALL
: dwStyle
|= LVS_SMALLICON
; break;
236 case ID_VIEW_DETAILS
: dwStyle
|= LVS_REPORT
; break;
238 SetWindowLongPtrW(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
240 RefreshApplicationPage();
243 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
)
247 BOOL bItemRemoved
= FALSE
;
249 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
250 HIMAGELIST hImageListLarge
;
251 HIMAGELIST hImageListSmall
;
253 /* If we couldn't create the event then exit the thread */
256 /* Wait for an the event or application close */
257 if (GetMessage(&msg
, NULL
, 0, 0) <= 0)
260 if (msg
.message
== WM_TIMER
)
265 * Should this be EnumDesktopWindows() instead?
268 EnumWindows(EnumWindowsProc
, 0);
270 (void)ListView_DeleteAllItems(hApplicationPageListCtrl
);
272 /* Get the image lists */
273 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
274 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
276 /* Check to see if we need to remove any items from the list */
277 for (i
=ListView_GetItemCount(hApplicationPageListCtrl
)-1; i
>=0; i
--)
279 memset(&item
, 0, sizeof(LV_ITEM
));
280 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
282 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
284 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
285 if (!IsWindow(pAPLI
->hWnd
)||
286 (wcslen(pAPLI
->szTitle
) <= 0) ||
287 !IsWindowVisible(pAPLI
->hWnd
) ||
288 (GetParent(pAPLI
->hWnd
) != NULL
) ||
289 (GetWindow(pAPLI
->hWnd
, GW_OWNER
) != NULL
) ||
290 (GetWindowLongPtr(pAPLI
->hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
292 ImageList_Remove(hImageListLarge
, item
.iItem
);
293 ImageList_Remove(hImageListSmall
, item
.iItem
);
295 (void)ListView_DeleteItem(hApplicationPageListCtrl
, item
.iItem
);
296 HeapFree(GetProcessHeap(), 0, pAPLI
);
302 * If an item was removed from the list then
303 * we need to resync all the items with the
308 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
310 memset(&item
, 0, sizeof(LV_ITEM
));
311 item
.mask
= LVIF_IMAGE
;
314 (void)ListView_SetItem(hApplicationPageListCtrl
, &item
);
316 bItemRemoved
= FALSE
;
319 ApplicationPageUpdate();
324 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
330 HICON
* xhIcon
= (HICON
*)&hIcon
;
332 typedef int (FAR __stdcall
*IsHungAppWindowProc
)(HWND
);
333 IsHungAppWindowProc IsHungAppWindow
;
336 /* Skip our window */
337 if (hWnd
== hMainWnd
)
340 bLargeIcon
= (TaskManagerSettings
.ViewMode
== ID_VIEW_LARGE
);
342 GetWindowTextW(hWnd
, szText
, 260); /* Get the window text */
344 /* Check and see if this is a top-level app window */
345 if ((wcslen(szText
) <= 0) ||
346 !IsWindowVisible(hWnd
) ||
347 (GetParent(hWnd
) != NULL
) ||
348 (GetWindow(hWnd
, GW_OWNER
) != NULL
) ||
349 (GetWindowLongPtrW(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
351 return TRUE
; /* Skip this window */
355 /* Get the icon for this window */
357 SendMessageTimeoutW(hWnd
, WM_GETICON
,bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
361 hIcon
= (HICON
)(LONG_PTR
)GetClassLongPtrW(hWnd
, bLargeIcon
? GCL_HICON
: GCL_HICONSM
);
362 if (!hIcon
) hIcon
= (HICON
)(LONG_PTR
)GetClassLongPtrW(hWnd
, bLargeIcon
? GCL_HICONSM
: GCL_HICON
);
363 if (!hIcon
) SendMessageTimeoutW(hWnd
, WM_QUERYDRAGICON
, 0, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
364 if (!hIcon
) SendMessageTimeoutW(hWnd
, WM_GETICON
, bLargeIcon
? ICON_SMALL
/*0*/ : ICON_BIG
/*1*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
368 hIcon
= LoadIconW(hInst
, bLargeIcon
? MAKEINTRESOURCEW(IDI_WINDOW
) : MAKEINTRESOURCEW(IDI_WINDOWSM
));
372 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandleW(L
"USER32.DLL"), "IsHungAppWindow");
375 bHung
= IsHungAppWindow(hWnd
);
377 AddOrUpdateHwnd(hWnd
, szText
, hIcon
, bHung
);
382 void AddOrUpdateHwnd(HWND hWnd
, WCHAR
*szTitle
, HICON hIcon
, BOOL bHung
)
384 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
385 HIMAGELIST hImageListLarge
;
386 HIMAGELIST hImageListSmall
;
389 BOOL bAlreadyInList
= FALSE
;
391 memset(&item
, 0, sizeof(LV_ITEM
));
393 /* Get the image lists */
394 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
395 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
397 /* Check to see if it's already in our list */
398 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
400 memset(&item
, 0, sizeof(LV_ITEM
));
401 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
403 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
405 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
406 if (pAPLI
->hWnd
== hWnd
)
408 bAlreadyInList
= TRUE
;
413 /* If it is already in the list then update it if necessary */
416 /* Check to see if anything needs updating */
417 if ((pAPLI
->hIcon
!= hIcon
) ||
418 (_wcsicmp(pAPLI
->szTitle
, szTitle
) != 0) ||
419 (pAPLI
->bHung
!= bHung
))
421 /* Update the structure */
422 pAPLI
->hIcon
= hIcon
;
423 pAPLI
->bHung
= bHung
;
424 wcscpy(pAPLI
->szTitle
, szTitle
);
426 /* Update the image list */
427 ImageList_ReplaceIcon(hImageListLarge
, item
.iItem
, hIcon
);
428 ImageList_ReplaceIcon(hImageListSmall
, item
.iItem
, hIcon
);
430 /* Update the list view */
431 (void)ListView_RedrawItems(hApplicationPageListCtrl
, 0, ListView_GetItemCount(hApplicationPageListCtrl
));
432 /* UpdateWindow(hApplicationPageListCtrl); */
433 InvalidateRect(hApplicationPageListCtrl
, NULL
, 0);
436 /* It is not already in the list so add it */
439 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM
));
442 pAPLI
->hIcon
= hIcon
;
443 pAPLI
->bHung
= bHung
;
444 wcscpy(pAPLI
->szTitle
, szTitle
);
446 /* Add the item to the list */
447 memset(&item
, 0, sizeof(LV_ITEM
));
448 item
.mask
= LVIF_TEXT
|LVIF_IMAGE
|LVIF_PARAM
;
449 ImageList_AddIcon(hImageListLarge
, hIcon
);
450 item
.iImage
= ImageList_AddIcon(hImageListSmall
, hIcon
);
451 item
.pszText
= LPSTR_TEXTCALLBACK
;
452 item
.iItem
= ListView_GetItemCount(hApplicationPageListCtrl
);
453 item
.lParam
= (LPARAM
)pAPLI
;
454 (void)ListView_InsertItem(hApplicationPageListCtrl
, &item
);
459 void ApplicationPageUpdate(void)
461 /* Enable or disable the "End Task" & "Switch To" buttons */
462 if (ListView_GetSelectedCount(hApplicationPageListCtrl
))
464 EnableWindow(hApplicationPageEndTaskButton
, TRUE
);
468 EnableWindow(hApplicationPageEndTaskButton
, FALSE
);
470 /* Enable "Switch To" button only if one app is selected */
471 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1 )
473 EnableWindow(hApplicationPageSwitchToButton
, TRUE
);
477 EnableWindow(hApplicationPageSwitchToButton
, FALSE
);
480 /* If we are on the applications tab the windows menu will be */
481 /* present on the menu bar so enable & disable the menu items */
482 if (TabCtrl_GetCurSel(hTabWnd
) == 0)
487 hMenu
= GetMenu(hMainWnd
);
488 hWindowsMenu
= GetSubMenu(hMenu
, 3);
490 /* Only one item selected */
491 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
493 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
494 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
495 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
496 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
497 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
498 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
500 /* More than one item selected */
501 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
503 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
504 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
505 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
506 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
507 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
508 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
510 /* No items selected */
513 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
514 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
515 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
516 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
517 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
518 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
523 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
)
529 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
;
533 idctrl
= (int) wParam
;
534 pnmh
= (LPNMHDR
) lParam
;
535 pnmv
= (LPNM_LISTVIEW
) lParam
;
536 pnmdi
= (LV_DISPINFO
*) lParam
;
538 if (pnmh
->hwndFrom
== hApplicationPageListCtrl
) {
539 switch (pnmh
->code
) {
540 case LVN_ITEMCHANGED
:
541 ApplicationPageUpdate();
544 case LVN_GETDISPINFO
:
545 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)pnmdi
->item
.lParam
;
547 /* Update the item text */
548 if (pnmdi
->item
.iSubItem
== 0)
550 wcsncpy(pnmdi
->item
.pszText
, pAPLI
->szTitle
, pnmdi
->item
.cchTextMax
);
553 /* Update the item status */
554 else if (pnmdi
->item
.iSubItem
== 1)
558 LoadStringW( GetModuleHandleW(NULL
), IDS_Not_Responding
, szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
562 LoadStringW( GetModuleHandleW(NULL
), IDS_Running
, (LPWSTR
) szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
564 wcsncpy(pnmdi
->item
.pszText
, szMsg
, pnmdi
->item
.cchTextMax
);
571 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
573 ApplicationPageShowContextMenu1();
577 ApplicationPageShowContextMenu2();
584 ApplicationPage_OnSwitchTo();
589 else if (pnmh
->hwndFrom
== ListView_GetHeader(hApplicationPageListCtrl
))
595 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
597 ApplicationPageShowContextMenu1();
601 ApplicationPageShowContextMenu2();
608 (void)ListView_SortItems(hApplicationPageListCtrl
, ApplicationPageCompareFunc
, 0);
609 bSortAscending
= !bSortAscending
;
617 void ApplicationPageShowContextMenu1(void)
625 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT1
));
626 hSubMenu
= GetSubMenu(hMenu
, 0);
628 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, TaskManagerSettings
.ViewMode
, MF_BYCOMMAND
);
630 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
635 void ApplicationPageShowContextMenu2(void)
643 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT2
));
644 hSubMenu
= GetSubMenu(hMenu
, 0);
646 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
648 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
649 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
650 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
651 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
652 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
653 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
655 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
657 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
658 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
659 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
660 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
661 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
662 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
666 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
667 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
668 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
669 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
670 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
671 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
674 SetMenuDefaultItem(hSubMenu
, ID_APPLICATION_PAGE_SWITCHTO
, MF_BYCOMMAND
);
676 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
681 void ApplicationPage_OnView(DWORD dwMode
)
686 hMenu
= GetMenu(hMainWnd
);
687 hViewMenu
= GetSubMenu(hMenu
, 2);
689 TaskManagerSettings
.ViewMode
= dwMode
;
690 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, dwMode
, MF_BYCOMMAND
);
692 UpdateApplicationListControlViewSetting();
695 void ApplicationPage_OnWindowsTile(DWORD dwMode
)
697 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
703 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
706 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
707 memset(&item
, 0, sizeof(LV_ITEM
));
708 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
710 item
.stateMask
= (UINT
)-1;
711 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
713 if (item
.state
& LVIS_SELECTED
) {
714 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
716 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
722 TileWindows(NULL
, dwMode
, NULL
, nWndCount
, hWndArray
);
723 HeapFree(GetProcessHeap(), 0, hWndArray
);
726 void ApplicationPage_OnWindowsMinimize(void)
728 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
732 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
733 memset(&item
, 0, sizeof(LV_ITEM
));
734 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
736 item
.stateMask
= (UINT
)-1;
737 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
738 if (item
.state
& LVIS_SELECTED
) {
739 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
741 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
747 void ApplicationPage_OnWindowsMaximize(void)
749 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
753 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
754 memset(&item
, 0, sizeof(LV_ITEM
));
755 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
757 item
.stateMask
= (UINT
)-1;
758 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
759 if (item
.state
& LVIS_SELECTED
) {
760 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
762 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
768 void ApplicationPage_OnWindowsCascade(void)
770 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
776 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
779 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
780 memset(&item
, 0, sizeof(LV_ITEM
));
781 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
783 item
.stateMask
= (UINT
)-1;
784 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
785 if (item
.state
& LVIS_SELECTED
) {
786 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
788 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
793 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
794 HeapFree(GetProcessHeap(), 0, hWndArray
);
797 void ApplicationPage_OnWindowsBringToFront(void)
799 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
803 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
804 memset(&item
, 0, sizeof(LV_ITEM
));
805 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
807 item
.stateMask
= (UINT
)-1;
808 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
809 if (item
.state
& LVIS_SELECTED
) {
810 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
815 if (IsIconic(pAPLI
->hWnd
))
816 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
817 BringWindowToTop(pAPLI
->hWnd
);
821 void ApplicationPage_OnSwitchTo(void)
823 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
827 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
828 memset(&item
, 0, sizeof(LV_ITEM
));
829 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
831 item
.stateMask
= (UINT
)-1;
832 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
834 if (item
.state
& LVIS_SELECTED
) {
835 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
840 typedef void (WINAPI
*PROCSWITCHTOTHISWINDOW
) (HWND
, BOOL
);
841 PROCSWITCHTOTHISWINDOW SwitchToThisWindow
;
843 HMODULE hUser32
= GetModuleHandleW(L
"USER32");
844 SwitchToThisWindow
= (PROCSWITCHTOTHISWINDOW
)GetProcAddress(hUser32
, "SwitchToThisWindow");
845 if (SwitchToThisWindow
) {
846 SwitchToThisWindow(pAPLI
->hWnd
, TRUE
);
848 if (IsIconic(pAPLI
->hWnd
))
849 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
850 BringWindowToTop(pAPLI
->hWnd
);
851 SetForegroundWindow(pAPLI
->hWnd
);
853 if (TaskManagerSettings
.MinimizeOnUse
)
854 ShowWindow(hMainWnd
, SW_MINIMIZE
);
858 void ApplicationPage_OnEndTask(void)
860 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
864 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
865 memset(&item
, 0, sizeof(LV_ITEM
));
866 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
868 item
.stateMask
= (UINT
)-1;
869 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
870 if (item
.state
& LVIS_SELECTED
) {
871 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
873 PostMessageW(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
879 void ApplicationPage_OnGotoProcess(void)
881 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
885 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
886 memset(&item
, 0, sizeof(LV_ITEM
));
887 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
889 item
.stateMask
= (UINT
)-1;
890 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
891 if (item
.state
& LVIS_SELECTED
) {
892 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
899 GetWindowThreadProcessId(pAPLI
->hWnd
, &dwProcessId
);
901 * Switch to the process tab
903 TabCtrl_SetCurFocus(hTabWnd
, 1);
905 * Select the process item in the list
907 i
= ProcGetIndexByProcessId(dwProcessId
);
910 ListView_SetItemState(hProcessPageListCtrl
,
912 LVIS_SELECTED
| LVIS_FOCUSED
,
913 LVIS_SELECTED
| LVIS_FOCUSED
);
914 (void)ListView_EnsureVisible(hProcessPageListCtrl
,
921 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
923 LPAPPLICATION_PAGE_LIST_ITEM Param1
;
924 LPAPPLICATION_PAGE_LIST_ITEM Param2
;
926 if (bSortAscending
) {
927 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
928 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
930 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
931 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
933 return wcscmp(Param1
->szTitle
, Param2
->szTitle
);