1 // TaskMgr.cpp : Defines the entry point for the application.
4 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
30 #define STATUS_WINDOW 2001
33 HINSTANCE hInst
; // current instance
35 HWND hMainWnd
; // Main Window
36 HWND hStatusWnd
; // Status Bar Window
37 HWND hTabWnd
; // Tab Control Window
39 int nMinimumWidth
; // Minimum width of the dialog (OnSize()'s cx)
40 int nMinimumHeight
; // Minimum height of the dialog (OnSize()'s cy)
42 int nOldWidth
; // Holds the previous client area width
43 int nOldHeight
; // Holds the previous client area height
45 BOOL bInMenuLoop
= FALSE
; // Tells us if we are in the menu loop
47 TASKMANAGER_SETTINGS TaskManagerSettings
;
50 int APIENTRY
WinMain(HINSTANCE hInstance
,
51 HINSTANCE hPrevInstance
,
59 // Initialize global variables
62 // Change our priority class to HIGH
63 hProcess
= OpenProcess(PROCESS_ALL_ACCESS
, FALSE
, GetCurrentProcessId());
64 SetPriorityClass(hProcess
, HIGH_PRIORITY_CLASS
);
65 CloseHandle(hProcess
);
67 // Now lets get the SE_DEBUG_NAME priviledge
68 // so that we can debug processes
70 // Get a token for this process.
71 if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
| TOKEN_QUERY
, &hToken
)) {
72 // Get the LUID for the debug privilege.
73 LookupPrivilegeValue(NULL
, SE_DEBUG_NAME
, &tkp
.Privileges
[0].Luid
);
75 tkp
.PrivilegeCount
= 1; // one privilege to set
76 tkp
.Privileges
[0].Attributes
= SE_PRIVILEGE_ENABLED
;
78 // Get the debug privilege for this process.
79 AdjustTokenPrivileges(hToken
, FALSE
, &tkp
, 0, (PTOKEN_PRIVILEGES
)NULL
, 0);
82 // Load our settings from the registry
85 // Initialize perf data
86 if (!PerfDataInitialize()) {
90 DialogBox(hInst
, (LPCTSTR
)IDD_TASKMGR_DIALOG
, NULL
, (DLGPROC
)TaskManagerWndProc
);
92 // Save our settings to the registry
94 PerfDataUninitialize();
101 //#define BEGIN_CMD_MAP(a) switch( ##a ) {
102 #define BEGIN_CMD_MAP(a) switch( a ) {
103 #define CMD_MAP_ENTRY(a, b) case a: b(); break;
104 #define END_CMD_MAP(a) }
108 // Message handler for dialog box.
109 LRESULT CALLBACK
TaskManagerWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
122 return OnCreate(hDlg
);
125 if (LOWORD(wParam
) == IDOK
|| LOWORD(wParam
) == IDCANCEL
) {
126 EndDialog(hDlg
, LOWORD(wParam
));
130 BEGIN_CMD_MAP( LOWORD(wParam
) )
131 CMD_MAP_ENTRY(ID_FILE_NEW
, TaskManager_OnFileNew
)
132 CMD_MAP_ENTRY(ID_OPTIONS_ALWAYSONTOP
, TaskManager_OnOptionsAlwaysOnTop
)
133 CMD_MAP_ENTRY(ID_OPTIONS_MINIMIZEONUSE
, TaskManager_OnOptionsMinimizeOnUse
)
134 CMD_MAP_ENTRY(ID_OPTIONS_HIDEWHENMINIMIZED
, TaskManager_OnOptionsHideWhenMinimized
)
135 CMD_MAP_ENTRY(ID_OPTIONS_SHOW16BITTASKS
, TaskManager_OnOptionsShow16BitTasks
)
136 CMD_MAP_ENTRY(ID_VIEW_LARGE
, ApplicationPage_OnViewLargeIcons
)
137 CMD_MAP_ENTRY(ID_VIEW_SMALL
, ApplicationPage_OnViewSmallIcons
)
138 CMD_MAP_ENTRY(ID_VIEW_DETAILS
, ApplicationPage_OnViewDetails
)
139 CMD_MAP_ENTRY(ID_VIEW_SHOWKERNELTIMES
, PerformancePage_OnViewShowKernelTimes
)
140 CMD_MAP_ENTRY(ID_VIEW_CPUHISTORY_ONEGRAPHALL
, PerformancePage_OnViewCPUHistoryOneGraphAll
)
141 CMD_MAP_ENTRY(ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, PerformancePage_OnViewCPUHistoryOneGraphPerCPU
)
142 CMD_MAP_ENTRY(ID_VIEW_UPDATESPEED_HIGH
, TaskManager_OnViewUpdateSpeedHigh
)
143 CMD_MAP_ENTRY(ID_VIEW_UPDATESPEED_NORMAL
, TaskManager_OnViewUpdateSpeedNormal
)
144 CMD_MAP_ENTRY(ID_VIEW_UPDATESPEED_LOW
, TaskManager_OnViewUpdateSpeedLow
)
145 CMD_MAP_ENTRY(ID_VIEW_UPDATESPEED_PAUSED
, TaskManager_OnViewUpdateSpeedPaused
)
146 CMD_MAP_ENTRY(ID_VIEW_SELECTCOLUMNS
, ProcessPage_OnViewSelectColumns
)
147 CMD_MAP_ENTRY(ID_VIEW_REFRESH
, TaskManager_OnViewRefresh
)
148 CMD_MAP_ENTRY(ID_WINDOWS_TILEHORIZONTALLY
, ApplicationPage_OnWindowsTileHorizontally
)
149 CMD_MAP_ENTRY(ID_WINDOWS_TILEVERTICALLY
, ApplicationPage_OnWindowsTileVertically
)
150 CMD_MAP_ENTRY(ID_WINDOWS_MINIMIZE
, ApplicationPage_OnWindowsMinimize
)
151 CMD_MAP_ENTRY(ID_WINDOWS_MAXIMIZE
, ApplicationPage_OnWindowsMaximize
)
152 CMD_MAP_ENTRY(ID_WINDOWS_CASCADE
, ApplicationPage_OnWindowsCascade
)
153 CMD_MAP_ENTRY(ID_WINDOWS_BRINGTOFRONT
, ApplicationPage_OnWindowsBringToFront
)
154 CMD_MAP_ENTRY(ID_APPLICATION_PAGE_SWITCHTO
, ApplicationPage_OnSwitchTo
)
155 CMD_MAP_ENTRY(ID_APPLICATION_PAGE_ENDTASK
, ApplicationPage_OnEndTask
)
156 CMD_MAP_ENTRY(ID_APPLICATION_PAGE_GOTOPROCESS
, ApplicationPage_OnGotoProcess
)
157 CMD_MAP_ENTRY(ID_PROCESS_PAGE_ENDPROCESS
, ProcessPage_OnEndProcess
)
158 CMD_MAP_ENTRY(ID_PROCESS_PAGE_ENDPROCESSTREE
, ProcessPage_OnEndProcessTree
)
159 CMD_MAP_ENTRY(ID_PROCESS_PAGE_DEBUG
, ProcessPage_OnDebug
)
160 CMD_MAP_ENTRY(ID_PROCESS_PAGE_SETAFFINITY
, ProcessPage_OnSetAffinity
)
161 CMD_MAP_ENTRY(ID_PROCESS_PAGE_SETPRIORITY_REALTIME
, ProcessPage_OnSetPriorityRealTime
)
162 CMD_MAP_ENTRY(ID_PROCESS_PAGE_SETPRIORITY_HIGH
, ProcessPage_OnSetPriorityHigh
)
163 CMD_MAP_ENTRY(ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL
, ProcessPage_OnSetPriorityAboveNormal
)
164 CMD_MAP_ENTRY(ID_PROCESS_PAGE_SETPRIORITY_NORMAL
, ProcessPage_OnSetPriorityNormal
)
165 CMD_MAP_ENTRY(ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL
, ProcessPage_OnSetPriorityBelowNormal
)
166 CMD_MAP_ENTRY(ID_PROCESS_PAGE_SETPRIORITY_LOW
, ProcessPage_OnSetPriorityLow
)
167 CMD_MAP_ENTRY(ID_HELP_ABOUT
, OnAbout
)
170 // Process menu commands
171 switch (LOWORD(wParam
))
174 TaskManager_OnFileNew();
176 case ID_OPTIONS_ALWAYSONTOP
:
177 TaskManager_OnOptionsAlwaysOnTop();
179 case ID_OPTIONS_MINIMIZEONUSE
:
180 TaskManager_OnOptionsMinimizeOnUse();
182 case ID_OPTIONS_HIDEWHENMINIMIZED
:
183 TaskManager_OnOptionsHideWhenMinimized();
185 case ID_OPTIONS_SHOW16BITTASKS
:
186 TaskManager_OnOptionsShow16BitTasks();
189 ApplicationPage_OnViewLargeIcons();
192 ApplicationPage_OnViewSmallIcons();
194 case ID_VIEW_DETAILS
:
195 ApplicationPage_OnViewDetails();
197 case ID_VIEW_SHOWKERNELTIMES
:
198 PerformancePage_OnViewShowKernelTimes();
200 case ID_VIEW_CPUHISTORY_ONEGRAPHALL
:
201 PerformancePage_OnViewCPUHistoryOneGraphAll();
203 case ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
:
204 PerformancePage_OnViewCPUHistoryOneGraphPerCPU();
206 case ID_VIEW_UPDATESPEED_HIGH
:
207 TaskManager_OnViewUpdateSpeedHigh();
209 case ID_VIEW_UPDATESPEED_NORMAL
:
210 TaskManager_OnViewUpdateSpeedNormal();
212 case ID_VIEW_UPDATESPEED_LOW
:
213 TaskManager_OnViewUpdateSpeedLow();
215 case ID_VIEW_UPDATESPEED_PAUSED
:
216 TaskManager_OnViewUpdateSpeedPaused();
218 case ID_VIEW_SELECTCOLUMNS
:
219 ProcessPage_OnViewSelectColumns();
221 case ID_VIEW_REFRESH
:
222 PostMessage(hDlg
, WM_TIMER
, 0, 0);
224 case ID_WINDOWS_TILEHORIZONTALLY
:
225 ApplicationPage_OnWindowsTileHorizontally();
227 case ID_WINDOWS_TILEVERTICALLY
:
228 ApplicationPage_OnWindowsTileVertically();
230 case ID_WINDOWS_MINIMIZE
:
231 ApplicationPage_OnWindowsMinimize();
233 case ID_WINDOWS_MAXIMIZE
:
234 ApplicationPage_OnWindowsMaximize();
236 case ID_WINDOWS_CASCADE
:
237 ApplicationPage_OnWindowsCascade();
239 case ID_WINDOWS_BRINGTOFRONT
:
240 ApplicationPage_OnWindowsBringToFront();
242 case ID_APPLICATION_PAGE_SWITCHTO
:
243 ApplicationPage_OnSwitchTo();
245 case ID_APPLICATION_PAGE_ENDTASK
:
246 ApplicationPage_OnEndTask();
248 case ID_APPLICATION_PAGE_GOTOPROCESS
:
249 ApplicationPage_OnGotoProcess();
251 case ID_PROCESS_PAGE_ENDPROCESS
:
252 ProcessPage_OnEndProcess();
254 case ID_PROCESS_PAGE_ENDPROCESSTREE
:
255 ProcessPage_OnEndProcessTree();
257 case ID_PROCESS_PAGE_DEBUG
:
258 ProcessPage_OnDebug();
260 case ID_PROCESS_PAGE_SETAFFINITY
:
261 ProcessPage_OnSetAffinity();
263 case ID_PROCESS_PAGE_SETPRIORITY_REALTIME
:
264 ProcessPage_OnSetPriorityRealTime();
266 case ID_PROCESS_PAGE_SETPRIORITY_HIGH
:
267 ProcessPage_OnSetPriorityHigh();
269 case ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL
:
270 ProcessPage_OnSetPriorityAboveNormal();
272 case ID_PROCESS_PAGE_SETPRIORITY_NORMAL
:
273 ProcessPage_OnSetPriorityNormal();
275 case ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL
:
276 ProcessPage_OnSetPriorityBelowNormal();
278 case ID_PROCESS_PAGE_SETPRIORITY_LOW
:
279 ProcessPage_OnSetPriorityLow();
289 idctrl
= (int)wParam
;
290 pnmh
= (LPNMHDR
)lParam
;
291 if ((pnmh
->hwndFrom
== hTabWnd
) &&
292 (pnmh
->idFrom
== IDC_TAB
) &&
293 (pnmh
->code
== TCN_SELCHANGE
))
295 TaskManager_OnTabWndSelChange();
301 GetClientRect(hDlg
, &rc
);
302 Draw3dRect(hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.top
+ 2, GetSysColor(COLOR_3DSHADOW
), GetSysColor(COLOR_3DHILIGHT
));
303 ReleaseDC(hDlg
, hdc
);
307 hdc
= BeginPaint(hDlg
, &ps
);
308 GetClientRect(hDlg
, &rc
);
309 Draw3dRect(hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.top
+ 2, GetSysColor(COLOR_3DSHADOW
), GetSysColor(COLOR_3DHILIGHT
));
314 // Make sure the user is sizing the dialog
315 // in an acceptable range
316 pRC
= (LPRECT
)lParam
;
317 if ((wParam
== WMSZ_LEFT
) || (wParam
== WMSZ_TOPLEFT
) || (wParam
== WMSZ_BOTTOMLEFT
)) {
318 // If the width is too small enlarge it to the minimum
319 if (nMinimumWidth
> (pRC
->right
- pRC
->left
))
320 pRC
->left
= pRC
->right
- nMinimumWidth
;
322 // If the width is too small enlarge it to the minimum
323 if (nMinimumWidth
> (pRC
->right
- pRC
->left
))
324 pRC
->right
= pRC
->left
+ nMinimumWidth
;
326 if ((wParam
== WMSZ_TOP
) || (wParam
== WMSZ_TOPLEFT
) || (wParam
== WMSZ_TOPRIGHT
)) {
327 // If the height is too small enlarge it to the minimum
328 if (nMinimumHeight
> (pRC
->bottom
- pRC
->top
))
329 pRC
->top
= pRC
->bottom
- nMinimumHeight
;
331 // If the height is too small enlarge it to the minimum
332 if (nMinimumHeight
> (pRC
->bottom
- pRC
->top
))
333 pRC
->bottom
= pRC
->top
+ nMinimumHeight
;
339 // Handle the window sizing in it's own function
340 OnSize(wParam
, LOWORD(lParam
), HIWORD(lParam
));
344 // Handle the window moving in it's own function
345 OnMove(wParam
, LOWORD(lParam
), HIWORD(lParam
));
349 ShowWindow(hDlg
, SW_HIDE
);
350 TrayIcon_ShellRemoveTrayIcon();
351 wp
.length
= sizeof(WINDOWPLACEMENT
);
352 GetWindowPlacement(hDlg
, &wp
);
353 TaskManagerSettings
.Left
= wp
.rcNormalPosition
.left
;
354 TaskManagerSettings
.Top
= wp
.rcNormalPosition
.top
;
355 TaskManagerSettings
.Right
= wp
.rcNormalPosition
.right
;
356 TaskManagerSettings
.Bottom
= wp
.rcNormalPosition
.bottom
;
357 if (IsZoomed(hDlg
) || (wp
.flags
& WPF_RESTORETOMAXIMIZED
))
358 TaskManagerSettings
.Maximized
= TRUE
;
360 TaskManagerSettings
.Maximized
= FALSE
;
361 return DefWindowProc(hDlg
, message
, wParam
, lParam
);
364 // Refresh the performance data
366 RefreshApplicationPage();
367 RefreshProcessPage();
368 RefreshPerformancePage();
369 TrayIcon_ShellUpdateTrayIcon();
372 case WM_ENTERMENULOOP
:
373 TaskManager_OnEnterMenuLoop(hDlg
);
375 case WM_EXITMENULOOP
:
376 TaskManager_OnExitMenuLoop(hDlg
);
379 TaskManager_OnMenuSelect(hDlg
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
386 void FillSolidRect(HDC hDC
, LPCRECT lpRect
, COLORREF clr
)
388 SetBkColor(hDC
, clr
);
389 ExtTextOut(hDC
, 0, 0, ETO_OPAQUE
, lpRect
, NULL
, 0, NULL
);
392 void FillSolidRect2(HDC hDC
, int x
, int y
, int cx
, int cy
, COLORREF clr
)
396 SetBkColor(hDC
, clr
);
400 rect
.bottom
= y
+ cy
;
401 ExtTextOut(hDC
, 0, 0, ETO_OPAQUE
, &rect
, NULL
, 0, NULL
);
404 void Draw3dRect(HDC hDC
, int x
, int y
, int cx
, int cy
, COLORREF clrTopLeft
, COLORREF clrBottomRight
)
406 FillSolidRect2(hDC
, x
, y
, cx
- 1, 1, clrTopLeft
);
407 FillSolidRect2(hDC
, x
, y
, 1, cy
- 1, clrTopLeft
);
408 FillSolidRect2(hDC
, x
+ cx
, y
, -1, cy
, clrBottomRight
);
409 FillSolidRect2(hDC
, x
, y
+ cy
, cx
, -1, clrBottomRight
);
412 void Draw3dRect2(HDC hDC
, LPRECT lpRect
, COLORREF clrTopLeft
, COLORREF clrBottomRight
)
414 Draw3dRect(hDC
, lpRect
->left
, lpRect
->top
, lpRect
->right
- lpRect
->left
,
415 lpRect
->bottom
- lpRect
->top
, clrTopLeft
, clrBottomRight
);
418 BOOL
OnCreate(HWND hWnd
)
423 HMENU hUpdateSpeedMenu
;
424 HMENU hCPUHistoryMenu
;
431 SendMessage(hMainWnd
, WM_SETICON
, ICON_BIG
, (LPARAM
)LoadIcon(hInst
, MAKEINTRESOURCE(IDI_TASKMANAGER
)));
433 // Initialize the Windows Common Controls DLL
434 InitCommonControls();
436 // Get the minimum window sizes
437 GetWindowRect(hWnd
, &rc
);
438 nMinimumWidth
= (rc
.right
- rc
.left
);
439 nMinimumHeight
= (rc
.bottom
- rc
.top
);
441 // Create the status bar
442 hStatusWnd
= CreateStatusWindow(WS_VISIBLE
|WS_CHILD
|WS_CLIPSIBLINGS
|SBT_NOBORDERS
, _T(""), hWnd
, STATUS_WINDOW
);
446 // Create the status bar panes
450 SendMessage(hStatusWnd
, SB_SETPARTS
, 3, (long)nParts
);
453 hTabWnd
= GetDlgItem(hWnd
, IDC_TAB
);
455 hApplicationPage
= CreateDialog(hInst
, MAKEINTRESOURCE(IDD_APPLICATION_PAGE
), hWnd
, (DLGPROC
)ApplicationPageWndProc
);
456 hProcessPage
= CreateDialog(hInst
, MAKEINTRESOURCE(IDD_PROCESS_PAGE
), hWnd
, (DLGPROC
)ProcessPageWndProc
);
457 hPerformancePage
= CreateDialog(hInst
, MAKEINTRESOURCE(IDD_PERFORMANCE_PAGE
), hWnd
, (DLGPROC
)PerformancePageWndProc
);
459 hApplicationPage
= CreateDialog(hInst
, MAKEINTRESOURCE(IDD_APPLICATION_PAGE
), hTabWnd
, (DLGPROC
)ApplicationPageWndProc
);
460 hProcessPage
= CreateDialog(hInst
, MAKEINTRESOURCE(IDD_PROCESS_PAGE
), hTabWnd
, (DLGPROC
)ProcessPageWndProc
);
461 hPerformancePage
= CreateDialog(hInst
, MAKEINTRESOURCE(IDD_PERFORMANCE_PAGE
), hTabWnd
, (DLGPROC
)PerformancePageWndProc
);
464 _tcscpy(szTemp
, _T("Applications"));
465 memset(&item
, 0, sizeof(TCITEM
));
466 item
.mask
= TCIF_TEXT
;
467 item
.pszText
= szTemp
;
468 TabCtrl_InsertItem(hTabWnd
, 0, &item
);
469 _tcscpy(szTemp
, _T("Processes"));
470 memset(&item
, 0, sizeof(TCITEM
));
471 item
.mask
= TCIF_TEXT
;
472 item
.pszText
= szTemp
;
473 TabCtrl_InsertItem(hTabWnd
, 1, &item
);
474 _tcscpy(szTemp
, _T("Performance"));
475 memset(&item
, 0, sizeof(TCITEM
));
476 item
.mask
= TCIF_TEXT
;
477 item
.pszText
= szTemp
;
478 TabCtrl_InsertItem(hTabWnd
, 2, &item
);
480 // Size everything correctly
481 GetClientRect(hWnd
, &rc
);
482 nOldWidth
= rc
.right
;
483 nOldHeight
= rc
.bottom
;
484 //nOldStartX = rc.left;
485 //nOldStartY = rc.top;
487 #define PAGE_OFFSET_LEFT 17
488 #define PAGE_OFFSET_TOP 72
489 #define PAGE_OFFSET_WIDTH (PAGE_OFFSET_LEFT*2)
490 #define PAGE_OFFSET_HEIGHT (PAGE_OFFSET_TOP+32)
492 if ((TaskManagerSettings
.Left
!= 0) ||
493 (TaskManagerSettings
.Top
!= 0) ||
494 (TaskManagerSettings
.Right
!= 0) ||
495 (TaskManagerSettings
.Bottom
!= 0))
497 MoveWindow(hWnd
, TaskManagerSettings
.Left
, TaskManagerSettings
.Top
, TaskManagerSettings
.Right
- TaskManagerSettings
.Left
, TaskManagerSettings
.Bottom
- TaskManagerSettings
.Top
, TRUE
);
498 #ifdef __GNUC__TEST__
499 MoveWindow(hApplicationPage
, TaskManagerSettings
.Left
+ PAGE_OFFSET_LEFT
, TaskManagerSettings
.Top
+ PAGE_OFFSET_TOP
, TaskManagerSettings
.Right
- TaskManagerSettings
.Left
- PAGE_OFFSET_WIDTH
, TaskManagerSettings
.Bottom
- TaskManagerSettings
.Top
- PAGE_OFFSET_HEIGHT
, FALSE
);
500 MoveWindow(hProcessPage
, TaskManagerSettings
.Left
+ PAGE_OFFSET_LEFT
, TaskManagerSettings
.Top
+ PAGE_OFFSET_TOP
, TaskManagerSettings
.Right
- TaskManagerSettings
.Left
- PAGE_OFFSET_WIDTH
, TaskManagerSettings
.Bottom
- TaskManagerSettings
.Top
- PAGE_OFFSET_HEIGHT
, FALSE
);
501 MoveWindow(hPerformancePage
, TaskManagerSettings
.Left
+ PAGE_OFFSET_LEFT
, TaskManagerSettings
.Top
+ PAGE_OFFSET_TOP
, TaskManagerSettings
.Right
- TaskManagerSettings
.Left
- PAGE_OFFSET_WIDTH
, TaskManagerSettings
.Bottom
- TaskManagerSettings
.Top
- PAGE_OFFSET_HEIGHT
, FALSE
);
504 if (TaskManagerSettings
.Maximized
)
505 ShowWindow(hWnd
, SW_MAXIMIZE
);
507 // Set the always on top style
508 hMenu
= GetMenu(hWnd
);
509 hEditMenu
= GetSubMenu(hMenu
, 1);
510 hViewMenu
= GetSubMenu(hMenu
, 2);
511 hUpdateSpeedMenu
= GetSubMenu(hViewMenu
, 1);
512 hCPUHistoryMenu
= GetSubMenu(hViewMenu
, 7);
514 // Check or uncheck the always on top menu item
515 if (TaskManagerSettings
.AlwaysOnTop
) {
516 CheckMenuItem(hEditMenu
, ID_OPTIONS_ALWAYSONTOP
, MF_BYCOMMAND
|MF_CHECKED
);
517 SetWindowPos(hWnd
, HWND_TOPMOST
, 0, 0, 0, 0, SWP_NOMOVE
|SWP_NOSIZE
);
519 CheckMenuItem(hEditMenu
, ID_OPTIONS_ALWAYSONTOP
, MF_BYCOMMAND
|MF_UNCHECKED
);
520 SetWindowPos(hWnd
, HWND_NOTOPMOST
, 0, 0, 0, 0, SWP_NOMOVE
|SWP_NOSIZE
);
523 // Check or uncheck the minimize on use menu item
524 if (TaskManagerSettings
.MinimizeOnUse
)
525 CheckMenuItem(hEditMenu
, ID_OPTIONS_MINIMIZEONUSE
, MF_BYCOMMAND
|MF_CHECKED
);
527 CheckMenuItem(hEditMenu
, ID_OPTIONS_MINIMIZEONUSE
, MF_BYCOMMAND
|MF_UNCHECKED
);
529 // Check or uncheck the hide when minimized menu item
530 if (TaskManagerSettings
.HideWhenMinimized
)
531 CheckMenuItem(hEditMenu
, ID_OPTIONS_HIDEWHENMINIMIZED
, MF_BYCOMMAND
|MF_CHECKED
);
533 CheckMenuItem(hEditMenu
, ID_OPTIONS_HIDEWHENMINIMIZED
, MF_BYCOMMAND
|MF_UNCHECKED
);
535 // Check or uncheck the show 16-bit tasks menu item
536 if (TaskManagerSettings
.Show16BitTasks
)
537 CheckMenuItem(hEditMenu
, ID_OPTIONS_SHOW16BITTASKS
, MF_BYCOMMAND
|MF_CHECKED
);
539 CheckMenuItem(hEditMenu
, ID_OPTIONS_SHOW16BITTASKS
, MF_BYCOMMAND
|MF_UNCHECKED
);
541 if (TaskManagerSettings
.View_LargeIcons
)
542 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
543 else if (TaskManagerSettings
.View_SmallIcons
)
544 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
546 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
548 if (TaskManagerSettings
.ShowKernelTimes
)
549 CheckMenuItem(hViewMenu
, ID_VIEW_SHOWKERNELTIMES
, MF_BYCOMMAND
|MF_CHECKED
);
551 CheckMenuItem(hViewMenu
, ID_VIEW_SHOWKERNELTIMES
, MF_BYCOMMAND
|MF_UNCHECKED
);
553 if (TaskManagerSettings
.UpdateSpeed
== 1)
554 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_HIGH
, MF_BYCOMMAND
);
555 else if (TaskManagerSettings
.UpdateSpeed
== 2)
556 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_NORMAL
, MF_BYCOMMAND
);
557 else if (TaskManagerSettings
.UpdateSpeed
== 4)
558 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_LOW
, MF_BYCOMMAND
);
560 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_PAUSED
, MF_BYCOMMAND
);
562 if (TaskManagerSettings
.CPUHistory_OneGraphPerCPU
)
563 CheckMenuRadioItem(hCPUHistoryMenu
, ID_VIEW_CPUHISTORY_ONEGRAPHALL
, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, MF_BYCOMMAND
);
565 CheckMenuRadioItem(hCPUHistoryMenu
, ID_VIEW_CPUHISTORY_ONEGRAPHALL
, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, ID_VIEW_CPUHISTORY_ONEGRAPHALL
, MF_BYCOMMAND
);
567 nActivePage
= TaskManagerSettings
.ActiveTabPage
;
568 TabCtrl_SetCurFocus
/*Sel*/(hTabWnd
, 0);
569 TabCtrl_SetCurFocus
/*Sel*/(hTabWnd
, 1);
570 TabCtrl_SetCurFocus
/*Sel*/(hTabWnd
, 2);
571 TabCtrl_SetCurFocus
/*Sel*/(hTabWnd
, nActivePage
);
573 if (TaskManagerSettings
.UpdateSpeed
== 0)
575 else if (TaskManagerSettings
.UpdateSpeed
== 1)
578 SetTimer(hWnd
, 1, 1000, NULL
);
580 else if (TaskManagerSettings
.UpdateSpeed
== 2)
583 SetTimer(hWnd
, 1, 2000, NULL
);
585 else if (TaskManagerSettings
.UpdateSpeed
== 4)
588 SetTimer(hWnd
, 1, 4000, NULL
);
592 // Refresh the performance data
593 // Sample it twice so we can establish
594 // the delta values & cpu usage
599 RefreshApplicationPage();
600 RefreshProcessPage();
601 RefreshPerformancePage();
603 TrayIcon_ShellAddTrayIcon();
609 // This function handles all the moving events for the application
610 // It moves every child window that needs moving
611 void OnMove( UINT nType
, int cx
, int cy
)
613 #ifdef __GNUC__TEST__
614 MoveWindow(hApplicationPage
, TaskManagerSettings
.Left
+ PAGE_OFFSET_LEFT
, TaskManagerSettings
.Top
+ PAGE_OFFSET_TOP
, TaskManagerSettings
.Right
- TaskManagerSettings
.Left
- PAGE_OFFSET_WIDTH
, TaskManagerSettings
.Bottom
- TaskManagerSettings
.Top
- PAGE_OFFSET_HEIGHT
, FALSE
);
615 MoveWindow(hProcessPage
, TaskManagerSettings
.Left
+ PAGE_OFFSET_LEFT
, TaskManagerSettings
.Top
+ PAGE_OFFSET_TOP
, TaskManagerSettings
.Right
- TaskManagerSettings
.Left
- PAGE_OFFSET_WIDTH
, TaskManagerSettings
.Bottom
- TaskManagerSettings
.Top
- PAGE_OFFSET_HEIGHT
, FALSE
);
616 MoveWindow(hPerformancePage
, TaskManagerSettings
.Left
+ PAGE_OFFSET_LEFT
, TaskManagerSettings
.Top
+ PAGE_OFFSET_TOP
, TaskManagerSettings
.Right
- TaskManagerSettings
.Left
- PAGE_OFFSET_WIDTH
, TaskManagerSettings
.Bottom
- TaskManagerSettings
.Top
- PAGE_OFFSET_HEIGHT
, FALSE
);
621 // This function handles all the sizing events for the application
622 // It re-sizes every window, and child window that needs re-sizing
623 void OnSize( UINT nType
, int cx
, int cy
)
630 if (nType
== SIZE_MINIMIZED
)
633 nXDifference
= cx
- nOldWidth
;
634 nYDifference
= cy
- nOldHeight
;
638 // Update the status bar size
639 GetWindowRect(hStatusWnd
, &rc
);
640 SendMessage(hStatusWnd
, WM_SIZE
, nType
, MAKELPARAM(cx
, cy
+ (rc
.bottom
- rc
.top
)));
642 // Update the status bar pane sizes
643 nParts
[0] = bInMenuLoop
? -1 : 100;
646 SendMessage(hStatusWnd
, SB_SETPARTS
, bInMenuLoop
? 1 : 3, (long)nParts
);
648 // Resize the tab control
649 GetWindowRect(hTabWnd
, &rc
);
650 cx
= (rc
.right
- rc
.left
) + nXDifference
;
651 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
652 SetWindowPos(hTabWnd
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
654 // Resize the application page
655 GetWindowRect(hApplicationPage
, &rc
);
656 cx
= (rc
.right
- rc
.left
) + nXDifference
;
657 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
658 SetWindowPos(hApplicationPage
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
660 // Resize the process page
661 GetWindowRect(hProcessPage
, &rc
);
662 cx
= (rc
.right
- rc
.left
) + nXDifference
;
663 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
664 SetWindowPos(hProcessPage
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
666 // Resize the performance page
667 GetWindowRect(hPerformancePage
, &rc
);
668 cx
= (rc
.right
- rc
.left
) + nXDifference
;
669 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
670 SetWindowPos(hPerformancePage
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
674 void LoadSettings(void)
677 TCHAR szSubKey
[] = _T("Software\\ReactWare\\TaskManager");
681 // Window size & position settings
682 TaskManagerSettings
.Maximized
= FALSE
;
683 TaskManagerSettings
.Left
= 0;
684 TaskManagerSettings
.Top
= 0;
685 TaskManagerSettings
.Right
= 0;
686 TaskManagerSettings
.Bottom
= 0;
689 TaskManagerSettings
.ActiveTabPage
= 0;
691 // Options menu settings
692 TaskManagerSettings
.AlwaysOnTop
= FALSE
;
693 TaskManagerSettings
.MinimizeOnUse
= TRUE
;
694 TaskManagerSettings
.HideWhenMinimized
= TRUE
;
695 TaskManagerSettings
.Show16BitTasks
= TRUE
;
697 // Update speed settings
698 TaskManagerSettings
.UpdateSpeed
= 2;
700 // Applications page settings
701 TaskManagerSettings
.View_LargeIcons
= FALSE
;
702 TaskManagerSettings
.View_SmallIcons
= FALSE
;
703 TaskManagerSettings
.View_Details
= TRUE
;
705 // Processes page settings
706 TaskManagerSettings
.ShowProcessesFromAllUsers
= FALSE
; // Server-only?
707 TaskManagerSettings
.Column_ImageName
= TRUE
;
708 TaskManagerSettings
.Column_PID
= TRUE
;
709 TaskManagerSettings
.Column_CPUUsage
= TRUE
;
710 TaskManagerSettings
.Column_CPUTime
= TRUE
;
711 TaskManagerSettings
.Column_MemoryUsage
= TRUE
;
712 TaskManagerSettings
.Column_MemoryUsageDelta
= FALSE
;
713 TaskManagerSettings
.Column_PeakMemoryUsage
= FALSE
;
714 TaskManagerSettings
.Column_PageFaults
= FALSE
;
715 TaskManagerSettings
.Column_USERObjects
= FALSE
;
716 TaskManagerSettings
.Column_IOReads
= FALSE
;
717 TaskManagerSettings
.Column_IOReadBytes
= FALSE
;
718 TaskManagerSettings
.Column_SessionID
= FALSE
; // Server-only?
719 TaskManagerSettings
.Column_UserName
= FALSE
; // Server-only?
720 TaskManagerSettings
.Column_PageFaultsDelta
= FALSE
;
721 TaskManagerSettings
.Column_VirtualMemorySize
= FALSE
;
722 TaskManagerSettings
.Column_PagedPool
= FALSE
;
723 TaskManagerSettings
.Column_NonPagedPool
= FALSE
;
724 TaskManagerSettings
.Column_BasePriority
= FALSE
;
725 TaskManagerSettings
.Column_HandleCount
= FALSE
;
726 TaskManagerSettings
.Column_ThreadCount
= FALSE
;
727 TaskManagerSettings
.Column_GDIObjects
= FALSE
;
728 TaskManagerSettings
.Column_IOWrites
= FALSE
;
729 TaskManagerSettings
.Column_IOWriteBytes
= FALSE
;
730 TaskManagerSettings
.Column_IOOther
= FALSE
;
731 TaskManagerSettings
.Column_IOOtherBytes
= FALSE
;
733 for (i
= 0; i
< 25; i
++) {
734 TaskManagerSettings
.ColumnOrderArray
[i
] = i
;
736 TaskManagerSettings
.ColumnSizeArray
[0] = 105;
737 TaskManagerSettings
.ColumnSizeArray
[1] = 50;
738 TaskManagerSettings
.ColumnSizeArray
[2] = 107;
739 TaskManagerSettings
.ColumnSizeArray
[3] = 70;
740 TaskManagerSettings
.ColumnSizeArray
[4] = 35;
741 TaskManagerSettings
.ColumnSizeArray
[5] = 70;
742 TaskManagerSettings
.ColumnSizeArray
[6] = 70;
743 TaskManagerSettings
.ColumnSizeArray
[7] = 100;
744 TaskManagerSettings
.ColumnSizeArray
[8] = 70;
745 TaskManagerSettings
.ColumnSizeArray
[9] = 70;
746 TaskManagerSettings
.ColumnSizeArray
[10] = 70;
747 TaskManagerSettings
.ColumnSizeArray
[11] = 70;
748 TaskManagerSettings
.ColumnSizeArray
[12] = 70;
749 TaskManagerSettings
.ColumnSizeArray
[13] = 70;
750 TaskManagerSettings
.ColumnSizeArray
[14] = 60;
751 TaskManagerSettings
.ColumnSizeArray
[15] = 60;
752 TaskManagerSettings
.ColumnSizeArray
[16] = 60;
753 TaskManagerSettings
.ColumnSizeArray
[17] = 60;
754 TaskManagerSettings
.ColumnSizeArray
[18] = 60;
755 TaskManagerSettings
.ColumnSizeArray
[19] = 70;
756 TaskManagerSettings
.ColumnSizeArray
[20] = 70;
757 TaskManagerSettings
.ColumnSizeArray
[21] = 70;
758 TaskManagerSettings
.ColumnSizeArray
[22] = 70;
759 TaskManagerSettings
.ColumnSizeArray
[23] = 70;
760 TaskManagerSettings
.ColumnSizeArray
[24] = 70;
762 TaskManagerSettings
.SortColumn
= 1;
763 TaskManagerSettings
.SortAscending
= TRUE
;
765 // Performance page settings
766 TaskManagerSettings
.CPUHistory_OneGraphPerCPU
= TRUE
;
767 TaskManagerSettings
.ShowKernelTimes
= FALSE
;
770 if (RegOpenKeyEx(HKEY_CURRENT_USER
, szSubKey
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
773 dwSize
= sizeof(TASKMANAGER_SETTINGS
);
774 RegQueryValueEx(hKey
, _T("Preferences"), NULL
, NULL
, (LPBYTE
)&TaskManagerSettings
, &dwSize
);
780 void SaveSettings(void)
783 TCHAR szSubKey1
[] = _T("Software");
784 TCHAR szSubKey2
[] = _T("Software\\ReactWare");
785 TCHAR szSubKey3
[] = _T("Software\\ReactWare\\TaskManager");
787 // Open (or create) the key
789 RegCreateKeyEx(HKEY_CURRENT_USER
, szSubKey1
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
);
792 RegCreateKeyEx(HKEY_CURRENT_USER
, szSubKey2
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
);
795 if (RegCreateKeyEx(HKEY_CURRENT_USER
, szSubKey3
, 0, NULL
, REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
798 RegSetValueEx(hKey
, _T("Preferences"), 0, REG_BINARY
, (LPBYTE
)&TaskManagerSettings
, sizeof(TASKMANAGER_SETTINGS
));
803 void TaskManager_OnEnterMenuLoop(HWND hWnd
)
807 // Update the status bar pane sizes
809 SendMessage(hStatusWnd
, SB_SETPARTS
, 1, (long)&nParts
);
811 SendMessage(hStatusWnd
, SB_SETTEXT
, (WPARAM
)0, (LPARAM
)_T(""));
814 void TaskManager_OnExitMenuLoop(HWND hWnd
)
821 // Update the status bar pane sizes
822 GetClientRect(hWnd
, &rc
);
825 nParts
[2] = rc
.right
;
826 SendMessage(hStatusWnd
, SB_SETPARTS
, 3, (long)nParts
);
827 SendMessage(hStatusWnd
, SB_SETTEXT
, 0, (LPARAM
)_T(""));
828 wsprintf(text
, _T("CPU Usage: %3d%%"), PerfDataGetProcessorUsage());
829 SendMessage(hStatusWnd
, SB_SETTEXT
, 1, (LPARAM
)text
);
830 wsprintf(text
, _T("Processes: %d"), PerfDataGetProcessCount());
831 SendMessage(hStatusWnd
, SB_SETTEXT
, 0, (LPARAM
)text
);
834 void TaskManager_OnMenuSelect(HWND hWnd
, UINT nItemID
, UINT nFlags
, HMENU hSysMenu
)
838 _tcscpy(str
, TEXT(""));
839 if (LoadString(hInst
, nItemID
, str
, 100)) {
840 // load appropriate string
842 // first newline terminates actual string
843 lpsz
= _tcschr(lpsz
, '\n');
847 SendMessage(hStatusWnd
, SB_SETTEXT
, 0, (LPARAM
)str
);
850 void TaskManager_OnViewUpdateSpeedHigh(void)
854 HMENU hUpdateSpeedMenu
;
856 hMenu
= GetMenu(hMainWnd
);
857 hViewMenu
= GetSubMenu(hMenu
, 2);
858 hUpdateSpeedMenu
= GetSubMenu(hViewMenu
, 1);
860 TaskManagerSettings
.UpdateSpeed
= 1;
861 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_HIGH
, MF_BYCOMMAND
);
863 KillTimer(hMainWnd
, 1);
864 SetTimer(hMainWnd
, 1, 1000, NULL
);
867 void TaskManager_OnViewUpdateSpeedNormal(void)
871 HMENU hUpdateSpeedMenu
;
873 hMenu
= GetMenu(hMainWnd
);
874 hViewMenu
= GetSubMenu(hMenu
, 2);
875 hUpdateSpeedMenu
= GetSubMenu(hViewMenu
, 1);
877 TaskManagerSettings
.UpdateSpeed
= 2;
878 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_NORMAL
, MF_BYCOMMAND
);
880 KillTimer(hMainWnd
, 1);
881 SetTimer(hMainWnd
, 1, 2000, NULL
);
884 void TaskManager_OnViewUpdateSpeedLow(void)
888 HMENU hUpdateSpeedMenu
;
890 hMenu
= GetMenu(hMainWnd
);
891 hViewMenu
= GetSubMenu(hMenu
, 2);
892 hUpdateSpeedMenu
= GetSubMenu(hViewMenu
, 1);
894 TaskManagerSettings
.UpdateSpeed
= 4;
895 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_LOW
, MF_BYCOMMAND
);
897 KillTimer(hMainWnd
, 1);
898 SetTimer(hMainWnd
, 1, 4000, NULL
);
901 void TaskManager_OnViewRefresh(void)
903 PostMessage(hMainWnd
, WM_TIMER
, 0, 0);
906 void TaskManager_OnViewUpdateSpeedPaused(void)
910 HMENU hUpdateSpeedMenu
;
912 hMenu
= GetMenu(hMainWnd
);
913 hViewMenu
= GetSubMenu(hMenu
, 2);
914 hUpdateSpeedMenu
= GetSubMenu(hViewMenu
, 1);
915 TaskManagerSettings
.UpdateSpeed
= 0;
916 CheckMenuRadioItem(hUpdateSpeedMenu
, ID_VIEW_UPDATESPEED_HIGH
, ID_VIEW_UPDATESPEED_PAUSED
, ID_VIEW_UPDATESPEED_PAUSED
, MF_BYCOMMAND
);
917 KillTimer(hMainWnd
, 1);
920 void TaskManager_OnTabWndSelChange(void)
928 hMenu
= GetMenu(hMainWnd
);
929 hViewMenu
= GetSubMenu(hMenu
, 2);
930 hOptionsMenu
= GetSubMenu(hMenu
, 1);
931 TaskManagerSettings
.ActiveTabPage
= TabCtrl_GetCurSel(hTabWnd
);
932 for (i
= GetMenuItemCount(hViewMenu
) - 1; i
> 2; i
--) {
933 hSubMenu
= GetSubMenu(hViewMenu
, i
);
935 DestroyMenu(hSubMenu
);
936 RemoveMenu(hViewMenu
, i
, MF_BYPOSITION
);
938 RemoveMenu(hOptionsMenu
, 3, MF_BYPOSITION
);
939 switch (TaskManagerSettings
.ActiveTabPage
) {
941 ShowWindow(hApplicationPage
, SW_SHOW
);
942 ShowWindow(hProcessPage
, SW_HIDE
);
943 ShowWindow(hPerformancePage
, SW_HIDE
);
944 BringWindowToTop(hApplicationPage
);
945 AppendMenu(hViewMenu
, MF_STRING
, ID_VIEW_LARGE
, _T("Lar&ge Icons"));
946 AppendMenu(hViewMenu
, MF_STRING
, ID_VIEW_SMALL
, _T("S&mall Icons"));
947 AppendMenu(hViewMenu
, MF_STRING
, ID_VIEW_DETAILS
, _T("&Details"));
949 if (GetMenuItemCount(hMenu
) <= 4) {
950 hSubMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_WINDOWSMENU
));
951 InsertMenu(hMenu
, 3, MF_BYPOSITION
|MF_POPUP
, (UINT
)hSubMenu
, _T("&Windows"));
952 DrawMenuBar(hMainWnd
);
954 if (TaskManagerSettings
.View_LargeIcons
)
955 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
956 else if (TaskManagerSettings
.View_SmallIcons
)
957 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
959 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
961 // Give the application list control focus
963 SetFocus(hApplicationPageListCtrl
);
967 ShowWindow(hApplicationPage
, SW_HIDE
);
968 ShowWindow(hProcessPage
, SW_SHOW
);
969 ShowWindow(hPerformancePage
, SW_HIDE
);
970 BringWindowToTop(hProcessPage
);
971 AppendMenu(hViewMenu
, MF_STRING
, ID_VIEW_SELECTCOLUMNS
, _T("&Select Columns..."));
972 AppendMenu(hOptionsMenu
, MF_STRING
, ID_OPTIONS_SHOW16BITTASKS
, _T("&Show 16-bit tasks"));
973 if (TaskManagerSettings
.Show16BitTasks
)
974 CheckMenuItem(hOptionsMenu
, ID_OPTIONS_SHOW16BITTASKS
, MF_BYCOMMAND
|MF_CHECKED
);
975 if (GetMenuItemCount(hMenu
) > 4)
977 RemoveMenu(hMenu
, 3, MF_BYPOSITION
);
978 DrawMenuBar(hMainWnd
);
981 // Give the process list control focus
983 SetFocus(hProcessPageListCtrl
);
987 ShowWindow(hApplicationPage
, SW_HIDE
);
988 ShowWindow(hProcessPage
, SW_HIDE
);
989 ShowWindow(hPerformancePage
, SW_SHOW
);
990 BringWindowToTop(hPerformancePage
);
991 if (GetMenuItemCount(hMenu
) > 4) {
992 RemoveMenu(hMenu
, 3, MF_BYPOSITION
);
993 DrawMenuBar(hMainWnd
);
995 hSubMenu
= CreatePopupMenu();
996 AppendMenu(hSubMenu
, MF_STRING
, ID_VIEW_CPUHISTORY_ONEGRAPHALL
, _T("&One Graph, All CPUs"));
997 AppendMenu(hSubMenu
, MF_STRING
, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, _T("One Graph &Per CPU"));
998 AppendMenu(hViewMenu
, MF_STRING
|MF_POPUP
, (UINT
)hSubMenu
, _T("&CPU History"));
999 AppendMenu(hViewMenu
, MF_STRING
, ID_VIEW_SHOWKERNELTIMES
, _T("&Show Kernel Times"));
1000 if (TaskManagerSettings
.ShowKernelTimes
)
1001 CheckMenuItem(hViewMenu
, ID_VIEW_SHOWKERNELTIMES
, MF_BYCOMMAND
|MF_CHECKED
);
1003 CheckMenuItem(hViewMenu
, ID_VIEW_SHOWKERNELTIMES
, MF_BYCOMMAND
|MF_UNCHECKED
);
1004 if (TaskManagerSettings
.CPUHistory_OneGraphPerCPU
)
1005 CheckMenuRadioItem(hSubMenu
, ID_VIEW_CPUHISTORY_ONEGRAPHALL
, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, MF_BYCOMMAND
);
1007 CheckMenuRadioItem(hSubMenu
, ID_VIEW_CPUHISTORY_ONEGRAPHALL
, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU
, ID_VIEW_CPUHISTORY_ONEGRAPHALL
, MF_BYCOMMAND
);
1009 // Give the tab control focus
1016 LPTSTR
GetLastErrorText(LPTSTR lpszBuf
, DWORD dwSize
)
1019 LPTSTR lpszTemp
= NULL
;
1021 dwRet
= FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
|FORMAT_MESSAGE_ARGUMENT_ARRAY
,
1029 // supplied buffer is not long enough
1030 if (!dwRet
|| ( (long)dwSize
< (long)dwRet
+14)) {
1031 lpszBuf
[0] = TEXT('\0');
1033 lpszTemp
[lstrlen(lpszTemp
)-2] = TEXT('\0'); //remove cr and newline character
1034 _stprintf(lpszBuf
, TEXT("%s (0x%x)"), lpszTemp
, (int)GetLastError());
1037 LocalFree((HLOCAL
)lpszTemp
);