📄 dskstat.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 + -