📄 itaskmgr.cpp
字号:
return 0;
// ----------------------------------------------------------
case WM_CLOSE:
EndDialog(hDlg, 0);
return TRUE;
// ----------------------------------------------------------
case WM_DESTROY:
KillTimer(hDlg, 1);
Shell_NotifyIcon(NIM_DELETE, &pTP->nidTrayIcon);
DelNetIcon (hDlg); //+NM
g_bThreadEnd/*pTP->bEnd*/ = TRUE;
ResumeThread(pTP->hIdleThread);
WaitForSingleObject(pTP->hIdleThread, 3000);
if(pTP)
{
LocalFree(pTP);
}
return 0;
}
return FALSE;
}
//-----------------------------------------------------------------------------
// create tab control
//-----------------------------------------------------------------------------
static BOOL CreateTab(ThreadPack* pTP)
{
RECT rcDlg;
HWND hwndProcessList;
HWND hwndCpupower;
HWND hwndTaskList;
HWND hwndNetStatus; //+NM
HWND hwndDskStatus; //+NM
HWND hwndTab = GetDlgItem(pTP->hDlg, IDC_TAB);
pTP->hwndTab = hwndTab;
if( hwndTab == NULL )
return FALSE;
GetClientRect(pTP->hDlg, &rcDlg);
TCITEM tie;
tie.mask = TCIF_TEXT | TCIF_IMAGE;
tie.iImage = -1;
// ---------------------------------------------------- CPUPOWER
tie.pszText = _T("CPU");
if(TabCtrl_InsertItem(hwndTab, MODE_CPUPOWER, &tie) == -1)
return FALSE;
hwndCpupower = CreateDialog( pTP->g_hInst, MAKEINTRESOURCE(IDD_CPU), hwndTab, DlgProcCpu );
if( hwndCpupower == NULL )
return FALSE;
SendMessage(hwndCpupower, WM_THREADPACK_POINTER, (WPARAM)pTP, 0);
ShowWindow(pTP->hwndCpupower, SW_SHOWNORMAL);
// ---------------------------------------------------- PROCESSLIST
tie.pszText = _T("Process");
if(TabCtrl_InsertItem(hwndTab, MODE_PROCESS, &tie) == -1)
return FALSE;
hwndProcessList = CreateDialog( pTP->g_hInst, MAKEINTRESOURCE(IDD_PROCESS_LIST), hwndTab, DlgProcProcess );
if( hwndProcessList == NULL )
return FALSE;
SendMessage(hwndProcessList, WM_THREADPACK_POINTER, (WPARAM)pTP, 0);
ShowWindow(pTP->hwndProcessList, SW_SHOWNORMAL);
// ---------------------------------------------------- TASKLIST
tie.pszText = _T("Task");
if(TabCtrl_InsertItem(hwndTab, MODE_TASKLIST, &tie) == -1)
return FALSE;
hwndTaskList = CreateDialog( pTP->g_hInst, MAKEINTRESOURCE(IDD_TASK_LIST), hwndTab, DlgProcTask );
if( hwndTaskList == NULL )
return FALSE;
SendMessage(hwndTaskList, WM_THREADPACK_POINTER, (WPARAM)pTP, 0);
ShowWindow(pTP->hwndTaskList, SW_SHOWNORMAL);
// ---------------------------------------------------- NETSTATUS //+NM
tie.pszText = _T("Net");
if(TabCtrl_InsertItem(hwndTab, MODE_NETSTATUS, &tie) == -1)
return FALSE;
hwndNetStatus = CreateDialog( pTP->g_hInst, MAKEINTRESOURCE(IDD_NET), hwndTab, DlgProcNet );
if( hwndNetStatus == NULL )
return FALSE;
SendMessage(hwndNetStatus, WM_THREADPACK_POINTER, (WPARAM)pTP, 0);
ShowWindow(pTP->hwndNetStatus, SW_SHOWNORMAL);
// ---------------------------------------------------- DSKSTATUS //+NM
tie.pszText = _T("Disk");
if(TabCtrl_InsertItem(hwndTab, MODE_DSKSTATUS, &tie) == -1)
return FALSE;
hwndDskStatus = CreateDialog( pTP->g_hInst, MAKEINTRESOURCE(IDD_DISK), hwndTab, DlgProcDsk );
if( hwndDskStatus == NULL )
return FALSE;
SendMessage(hwndDskStatus, WM_THREADPACK_POINTER, (WPARAM)pTP, 0);
ShowWindow(pTP->hwndDskStatus, SW_SHOWNORMAL);
// ---------------------------------------------------- ADD
pTP->hwndProcessList = hwndProcessList;
pTP->hwndCpupower = hwndCpupower;
pTP->hwndTaskList = hwndTaskList;
pTP->hwndNetStatus = hwndNetStatus; //+NM
pTP->hwndDskStatus = hwndDskStatus; //+NM
return TRUE;
}
//-----------------------------------------------------------------------------
// load icon image from resource block
//-----------------------------------------------------------------------------
static BOOL CreateIcon(ThreadPack* pTP)
{
HICON* pIcon = pTP->hIcon;
for( int ii = 0; ii < 12; ii++, pIcon++ )
{
*pIcon = (HICON)LoadImage( pTP->g_hInst,
MAKEINTRESOURCE(IDI_CPU_00 + ii), IMAGE_ICON, 16,16,0);
if( pIcon == NULL )
return FALSE;
}
return TRUE;
}
//-----------------------------------------------------------------------------
// measure cpu power and ...
//-----------------------------------------------------------------------------
static void Measure(ThreadPack* pTP)
{
static DWORD dwLastThreadTime = 0;
static DWORD dwLastTickTime = 0;
DWORD dwCurrentThreadTime =0;
DWORD dwCurrentTickTime = 0;
FILETIME ftCreationTime;
FILETIME ftExitTime;
FILETIME ftKernelTime;
FILETIME ftUserTime;
DWORD dwCpuPower;
MEMORYSTATUS ms;
ms.dwLength = sizeof(MEMORYSTATUS);
// search status
SuspendThread(pTP->hIdleThread);
dwCurrentTickTime = GetTickCount();
GetThreadTimes(pTP->hIdleThread, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime);
dwCurrentThreadTime = GetThreadTick(&ftKernelTime, &ftUserTime);
// calculate cpu power
if( dwCurrentTickTime != dwLastTickTime || dwLastThreadTime != 0 || dwLastTickTime != 0)
dwCpuPower = 100 - (((dwCurrentThreadTime - dwLastThreadTime) * 100) / (dwCurrentTickTime - dwLastTickTime));
else
dwCpuPower = 0; // avoid 0div
SetDlgItemInt(pTP->hDlg, IDC_CPUPOWER, dwCpuPower, 0);
// Draw tray icon
int nIconIndex = (dwCpuPower)*11/100;
if( nIconIndex > 11 || nIconIndex < 0 )
nIconIndex = 0;
pTP->nidTrayIcon.hIcon = pTP->hIcon[nIconIndex];
Shell_NotifyIcon(NIM_MODIFY, &pTP->nidTrayIcon);
// memory history
GlobalMemoryStatus(&ms);
// Shift history
memmove(pTP->chPowHistory+1, pTP->chPowHistory, HISTORY_MAX-1);
memmove(pTP->chMemHistory+1, pTP->chMemHistory, HISTORY_MAX-1);
// save history
*pTP->chPowHistory = (char)dwCpuPower;
*pTP->chMemHistory = (char)ms.dwMemoryLoad;
// save status
dwLastTickTime = GetTickCount();
dwLastThreadTime = dwCurrentThreadTime;
ResumeThread(pTP->hIdleThread);
}
//-----------------------------------------------------------------------------
// dummy thread for mesure cpu power
//-----------------------------------------------------------------------------
static void thIdle(LPVOID pvParams)
{
ThreadPack* pTP = (ThreadPack*)pvParams;
while(!g_bThreadEnd/*pTP->bEnd*/);
}
//-----------------------------------------------------------------------------
// helper
//-----------------------------------------------------------------------------
static DWORD GetThreadTick(FILETIME* a, FILETIME* b)
{
__int64 a64 = 0;
__int64 b64 = 0;
a64 = a->dwHighDateTime;
a64 <<= 32;
a64 += a->dwLowDateTime;
b64 = b->dwHighDateTime;
b64 <<= 32;
a64 += b->dwLowDateTime;
a64 += b64;
// nano sec to milli sec
a64 /= 10000;
return (DWORD)a64;
}
//-----------------------------------------------------------------------------
// about dlg proc
//-----------------------------------------------------------------------------
static BOOL CALLBACK DlgProcHelp(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_CLOSE:
EndDialog(hDlg, 0);
return TRUE;
}
return FALSE;
}
//-----------------------------------------------------------------------------
// HelperFunction
//-----------------------------------------------------------------------------
LPARAM GetSelectedItemLParam(HWND hwndLView)
{
int nIndex = -1;
LVITEM lvItem;
memset(&lvItem, 0, sizeof(LVITEM));
lvItem.mask = LVIF_PARAM;
nIndex = ListView_GetNextItem(hwndLView, nIndex, 0);
while( nIndex != -1 )
{
lvItem.iItem = nIndex;
if( ListView_GetItemState(hwndLView, nIndex, LVIS_SELECTED) )
{
ListView_GetItem(hwndLView, &lvItem);
return lvItem.lParam;
}
nIndex = ListView_GetNextItem(hwndLView, nIndex, 0);
}
return 0;
}
//-----------------------------------------------------------------------------
// select item by lparam
//-----------------------------------------------------------------------------
void SelectItemLParam(HWND hwndLView, LPARAM lParam)
{
int nIndex = -1;
LVITEM lvItem;
memset(&lvItem, 0, sizeof(LVITEM));
lvItem.mask = LVIF_PARAM;
nIndex = ListView_GetNextItem(hwndLView, nIndex, 0);
while( nIndex != -1 )
{
lvItem.iItem = nIndex;
ListView_GetItem(hwndLView, &lvItem);
if( lvItem.lParam == lParam )
{
ListView_SetItemState(hwndLView, nIndex, LVIS_SELECTED, LVIS_SELECTED);
}
nIndex = ListView_GetNextItem(hwndLView, nIndex, 0);
}
}
//-----------------------------------------------------------------------------
// create thread(s)
//-----------------------------------------------------------------------------
static BOOL CreateThreads(ThreadPack* pTP)
{
DWORD ThreadID;
pTP->hIdleThread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)thIdle, (LPVOID)pTP, CREATE_SUSPENDED, &ThreadID);
if( pTP->hIdleThread == NULL )
{
return FALSE;
}
SetThreadPriority(pTP->hIdleThread, THREAD_PRIORITY_IDLE);
ResumeThread(pTP->hIdleThread);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -