⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 itaskmgr.cpp

📁 Displays CPU time usage, the list of processes (can be terminated) and the task which are running (c
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -