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

📄 dskstat.cpp

📁 Displays CPU time usage, the list of processes (can be terminated) and the task which are running (c
💻 CPP
字号:
//+NM Copyright (c) 2003 Qta
#include "stdafx.h"
#include "ITaskMgr.h"

#include "iphlpapi.h"
#include "netiphlp.h"

#define MAX_DSKDATA	8		//嵟戝僪儔僀僽悢
struct _DSKDATA {
	int count;				//僪儔僀僽悢
	int selno;				//慖戰僪儔僀僽斣崋
	struct {
		DWORD	dwFree;		//嬻偒梕検
		DWORD	dwTotal;	//慡梕検
	}	l[MAX_DSKDATA];
};

static void LvDsk_InsertColumn (HWND hwndLV);
static int LvDsk_FindDisks (HWND hwndLV, struct _DSKDATA* dst);
static BOOL DrawGraph(ThreadPack* pTP, HWND hwndDraw);

//-----------------------------------------------------------------------------
// [Disk]僞僽
//-----------------------------------------------------------------------------
BOOL CALLBACK DlgProcDsk (HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	static ThreadPack* pTP = NULL;
	static struct _DSKDATA* dst = NULL;

	switch(Msg)
	{
	case WM_THREADPACK_POINTER:
	{
		pTP = (ThreadPack*)wParam;
		pTP->dst = LocalAlloc (LPTR, sizeof(struct _DSKDATA));
		dst = (struct _DSKDATA*) pTP->dst;		
		HWND hwndList = GetDlgItem (hDlg, IDC_LV_DSK);
		LvDsk_InsertColumn (hwndList);
		DWORD dwStyle;
		dwStyle = ListView_GetExtendedListViewStyle (hwndList);
		dwStyle |= LVS_EX_FULLROWSELECT;
		ListView_SetExtendedListViewStyle (hwndList, dwStyle);
		LvDsk_FindDisks (hwndList, dst);
		HWND hwndDraw = GetDlgItem (hDlg, IDC_DSK_DRAW);
		DrawGraph(pTP, hwndDraw);
		return TRUE;
	}	
	
	// ----------------------------------------------------------
	case WM_INITDIALOG:
	{
		return TRUE;
	}
	
	// ----------------------------------------------------------
	case WM_SIZE:
	{ 
		if( pTP == NULL )
			return 0;

		HWND hwndDraw = GetDlgItem(hDlg, IDC_DSK_DRAW);
		HWND hwndList = GetDlgItem(hDlg, IDC_LV_DSK);

		HDWP hdwp;
		RECT rcTab;
		RECT rcDraw;
		RECT rcList;

		SetRect(&rcTab, 0, 0, LOWORD(lParam), HIWORD(lParam));
		TabCtrl_AdjustRect(hDlg, FALSE, &rcTab);

		GetClientRect(hwndDraw, &rcDraw);
		GetClientRect(hwndList, &rcList);

		hdwp = BeginDeferWindowPos(2);
	
		DeferWindowPos(hdwp, hwndList, HWND_TOP
			, 5
			, 5
			, (rcTab.right - rcTab.left) -5 -5
			, 5 + (rcList.bottom - rcList.top)
			, 0);

		DeferWindowPos(hdwp, hwndDraw, HWND_TOP
			, 5
			, 5 + 5 + 5 + (rcList.bottom - rcList.top)
			, (rcTab.right - rcTab.left) -5 -5
			, (rcDraw.bottom - rcDraw.top)
			, 0);

		EndDeferWindowPos(hdwp);
		return 0;
	} 
	
	// ----------------------------------------------------------
	case WM_DRAWITEM:
	if (pTP) {
		LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
		if (lpdis) DrawGraph(pTP, lpdis->hwndItem);
		return TRUE;
	}

	case WM_TIMER:
	if (pTP && dst) {
		if (pTP->nMode == MODE_DSKSTATUS) {
			HWND hwndList = GetDlgItem(hDlg, IDC_LV_DSK);
			if (LvDsk_FindDisks (NULL, dst)) {
				LvDsk_FindDisks (hwndList, dst);
				InvalidateRect(GetDlgItem(hDlg, IDC_DSK_DRAW), NULL, FALSE);
			}
		}
	}
	break;

	case WM_NOTIFY:
	if (pTP) {
		int iIndex;
		LV_DISPINFO* plv = (LV_DISPINFO*)lParam;
		NMHDR* nmhdr = (NMHDR*)lParam;
		HWND hwndList = GetDlgItem(hDlg, IDC_LV_DSK);
		if (hwndList != nmhdr->hwndFrom) break;
		switch (plv->hdr.code) {
		case LVN_ITEMCHANGED:		//傾僀僥儉偺慖戰忬懺偺曄峏
			iIndex = ListView_GetNextItem (hwndList, -1, LVNI_FOCUSED);
			if(iIndex != -1){
				dst->selno = iIndex;
				InvalidateRect(GetDlgItem(hDlg, IDC_DSK_DRAW), NULL, FALSE);
			}
			break;
		}
	}
	break;

	default:
		break;

	}
	return FALSE;

}

//-----------------------------------------------------------------------------
// 梕検僌儔僼昞帵
//-----------------------------------------------------------------------------
static BOOL DrawGraph(ThreadPack* pTP, HWND hwndDraw)
{
	struct _DSKDATA* dst = (struct _DSKDATA*) pTP->dst;
	if (dst == NULL) return 0;

	if (pTP->nMode != MODE_DSKSTATUS)
		return TRUE;

	DWORD dwUsed  = (dst->l[dst->selno].dwTotal - dst->l[dst->selno].dwFree) / 1024;
	DWORD dwTotal = dst->l[dst->selno].dwTotal / 1024;

	HDC hDC;
	HBRUSH hBrush;
	RECT rect;
	RECT rc;

	hDC = GetDC (hwndDraw);

	GetClientRect(hwndDraw, &rect);

	int nRenge = 0;
	if (dwTotal) {
		nRenge = (dwUsed * (rect.right - rect.left)) / dwTotal;
	}

	hBrush = CreateSolidBrush (0xff0000);
	rc.left   = rect.left;
	rc.right  = nRenge;
	rc.top    = rect.top;
	rc.bottom = rect.bottom;
	FillRect (hDC, &rc, hBrush);
	DeleteObject (hBrush);

	hBrush = (HBRUSH) GetStockObject(WHITE_BRUSH);
	rc.left   = nRenge;
	rc.right  = rect.right;
	rc.top    = rect.top;
	rc.bottom = rect.bottom;
	FillRect (hDC, &rc, hBrush);

	ReleaseDC (hwndDraw, hDC);

	return TRUE;
}

//-----------------------------------------------------------------------------
// 儕僗僩偺僇儔儉僙僢僩
//-----------------------------------------------------------------------------
static void LvDsk_InsertColumn (HWND hwndLV)
{
    LVCOLUMN lvcol;

    lvcol.mask     = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    lvcol.fmt      = LVCFMT_LEFT;
    lvcol.cx       = 60;
    lvcol.pszText  = TEXT("Path");
    lvcol.iSubItem = 0;
    ListView_InsertColumn (hwndLV, 0, &lvcol);

    lvcol.fmt      = LVCFMT_RIGHT;
    lvcol.cx       = 50;
    lvcol.pszText  = TEXT("Free");
    lvcol.iSubItem = 1;
    ListView_InsertColumn (hwndLV, 1, &lvcol);

    lvcol.cx       = 50;
    lvcol.pszText  = TEXT("Used");
    lvcol.iSubItem = 2;
    ListView_InsertColumn (hwndLV, 2, &lvcol);
    
    lvcol.cx       = 50;
    lvcol.pszText  = TEXT("Total");
    lvcol.iSubItem = 3;
    ListView_InsertColumn (hwndLV, 3, &lvcol);

    lvcol.cx       = 40;
    lvcol.pszText  = TEXT("%");
    lvcol.iSubItem = 4;
    ListView_InsertColumn (hwndLV, 4, &lvcol);
}

//-----------------------------------------------------------------------------
// 僒僀僘暿昞帵彂幃曇廤
//-----------------------------------------------------------------------------
static TCHAR* LvDsk_SizeForm (DWORD dwSize)
{
	static TCHAR buf[MAX_PATH];
	if (dwSize < 1024) {
		wsprintf (buf, TEXT("%dB"), dwSize);
	}
	else
	if (dwSize < 1024*1000) {
		DWORD dwKB = dwSize / 1024;
		DWORD dwB  = dwSize % 1024;
		wsprintf (buf, TEXT("%dKB"), dwKB);
	}
	else
	if (dwSize < 1024*1000*10) {
		DWORD dwB  = dwSize % 1024;
		DWORD dwKB = dwSize / 1024;
		DWORD dwMB = dwKB   / 1000;
		dwKB = dwKB % 1000;
		wsprintf (buf, TEXT("%d.%02dMB"), dwMB, dwKB/10);
	}
	else
	if (dwSize < 1024*1000*1000) {
		DWORD dwB  = dwSize % 1024;
		DWORD dwKB = dwSize / 1024;
		DWORD dwMB = dwKB   / 1000;
		DWORD dwGB = dwMB   / 1000;
		dwKB = dwKB % 1000;
		dwMB = dwMB % 1000;
		wsprintf (buf, TEXT("%dMB"), dwMB);
	}
	else {
		DWORD dwB  = dwSize % 1024;
		DWORD dwKB = dwSize / 1024;
		DWORD dwMB = dwKB   / 1000;
		DWORD dwGB = dwMB   / 1000;
		dwKB = dwKB % 1000;
		dwMB = dwMB % 1000;
		wsprintf (buf, TEXT("%d.%02dGB"), dwGB, dwMB/10);
	}
	return buf;
}

//-----------------------------------------------------------------------------
// 崁栚傪捛壛
//-----------------------------------------------------------------------------
static int LvDsk_InsertItems (HWND hwndLV, TCHAR* szName, DWORD dwFree, DWORD dwUsed, DWORD dwTotal)
{
	int nCount;
	nCount = ListView_GetItemCount (hwndLV);
	if (nCount < 0) nCount = 0;

	LVITEM li;
	memset(&li, 0, sizeof(LVITEM));

	li.mask       = LVIF_TEXT | LVIF_PARAM;
	li.iItem      = nCount;
	li.iSubItem   = 0;
	li.pszText    = szName;
	li.cchTextMax = lstrlen (li.pszText);
	li.lParam     = 0;
	ListView_InsertItem (hwndLV, &li);

	li.mask       = LVIF_TEXT;
	li.iSubItem   = 1;
	li.pszText    = LvDsk_SizeForm (dwFree);
	li.cchTextMax = lstrlen (li.pszText);
	ListView_SetItem (hwndLV, &li);

	li.mask       = LVIF_TEXT;
	li.iSubItem   = 2;
	li.pszText    = LvDsk_SizeForm (dwUsed);
	li.cchTextMax = lstrlen (li.pszText);
	ListView_SetItem (hwndLV, &li);

	li.mask       = LVIF_TEXT;
	li.iSubItem   = 3;
	li.pszText    = LvDsk_SizeForm (dwTotal);
	li.cchTextMax = lstrlen (li.pszText);
	ListView_SetItem (hwndLV, &li);

	TCHAR buf[32];
	int par = ((dwUsed / 1024) * 100) / (dwTotal / 1024);
	wsprintf (buf, TEXT("%d%%"), par);

	li.mask       = LVIF_TEXT;
	li.iSubItem   = 4;
	li.pszText    = buf;
	li.cchTextMax = lstrlen (li.pszText);
	ListView_SetItem (hwndLV, &li);

	return nCount;
}

//-----------------------------------------------------------------------------
// 僨傿僗僋梕検傪専嵏
//-----------------------------------------------------------------------------
static int LvDsk_FindDisks (HWND hwndLV, struct _DSKDATA* dst)
{
	HANDLE	ff;
	WIN32_FIND_DATA wfd;

	int fUpdate = 0;
	int count = dst->count;
	dst->count = 0;

	if (hwndLV) ListView_DeleteAllItems (hwndLV);

	ULARGE_INTEGER lFreeBytesAbToCr;
	ULARGE_INTEGER lTotalNumberOfBytes;
	ULARGE_INTEGER lTotalNumberOfFreeBytes;

	GetDiskFreeSpaceEx (
		TEXT("\\"), 
		&lFreeBytesAbToCr,
		&lTotalNumberOfBytes, 
		&lTotalNumberOfFreeBytes );

	fUpdate |= (dst->l[dst->count].dwFree>>8 != lTotalNumberOfFreeBytes.LowPart>>8);
	dst->l[dst->count].dwFree  = lTotalNumberOfFreeBytes.LowPart;
	dst->l[dst->count].dwTotal = lTotalNumberOfBytes.LowPart;
	dst->count++;

	if (hwndLV) {
		LvDsk_InsertItems (hwndLV, TEXT("\\"), 
		lTotalNumberOfFreeBytes.LowPart, 
		lTotalNumberOfBytes.LowPart - lTotalNumberOfFreeBytes.LowPart,
		lTotalNumberOfBytes.LowPart);
	}

	ff = FindFirstFile (_T("\\*"), &wfd);
	if (ff == INVALID_HANDLE_VALUE) {
		if (dst->selno < dst->count) {
			dst->selno = 0;
		}
		fUpdate |= (count != dst->count);
		return fUpdate;
	}

	int rc;
	int n = 1;
	do {
		if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) &&
			wfd.cFileName[0] != TEXT('僱')) {
			TCHAR buf[MAX_PATH];
			buf[0] = TEXT('\\');
			lstrcpy (&buf[1], wfd.cFileName);
			GetDiskFreeSpaceEx (
				buf, 
				&lFreeBytesAbToCr,
				&lTotalNumberOfBytes, 
				&lTotalNumberOfFreeBytes );
			fUpdate |= (dst->l[dst->count].dwFree>>8 != lTotalNumberOfFreeBytes.LowPart>>8);
			dst->l[dst->count].dwFree  = lTotalNumberOfFreeBytes.LowPart;
			dst->l[dst->count].dwTotal = lTotalNumberOfBytes.LowPart;
			dst->count++;

			if (hwndLV) {
				LvDsk_InsertItems (hwndLV, wfd.cFileName, 
					lTotalNumberOfFreeBytes.LowPart, 
					lTotalNumberOfBytes.LowPart - lTotalNumberOfFreeBytes.LowPart,
					lTotalNumberOfBytes.LowPart);
			}
			n++;
		}
		rc = FindNextFile (ff, &wfd);
	} while (rc);

	FindClose(ff);

	if (dst->selno < dst->count) {
		dst->selno = 0;
	}
	fUpdate |= (count != dst->count);
	return fUpdate;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -