全局变量:
int MB = 1024*1024;//为什么用#define MB 1024*1024不对?
int GB = 1024*1024*1024;
对话框初始化:
TCHAR cUserName[256];//用户名字符数组。注意:此处不能使用字符指针,nSize得不到正确值。
DWORD nSize = sizeof(cUserName);//用户名数组大小
GetUserName(cUserName, &nSize);//获取用户名
SetDlgItemText(hwnd, IDC_EDT1, cUserName);//显示
GetOSVersion(hwnd, IDC_EDT2);//获取操作系统版本
GetUserLogicalDrives(hwnd, IDC_EDT3);//获取可用逻辑驱动器
AddComboBoxItem(hwnd, IDC_EDT4);//添加磁盘信息ComboBox项
SetTimer(hwnd, 1, 1000, GetDiskInfo);//设置定时器,处理相应ComboBox的选中项。
GetMemoryInfo(hwnd, IDC_EDT5); //获取内存信息
自定义函数:
void GetOSVersion(HWND hwnd, int id)
{
OSVERSIONINFO OSVersion;//操作系统版本结构体
TCHAR* cOSVersion;//输出操作系统版本字符串
ZeroMemory(&OSVersion, sizeof(OSVersion));//初始化结构体
OSVersion.dwOSVersionInfoSize = sizeof(OSVersion);//结构体大小
GetVersionEx(&OSVersion);//获取操作系统版本
switch(OSVersion.dwPlatformId)//根据结构体dwPlatformId字段判断是NT架构还是旧架构
{
case VER_PLATFORM_WIN32_NT:
if(OSVersion.dwMajorVersion == 5 && OSVersion.dwMinorVersion == 0)//根据主版本号和小版本号判断操作系统版本
{
cOSVersion = TEXT(“Windows 2000”);
}
else if(OSVersion.dwMajorVersion == 5 && OSVersion.dwMinorVersion == 1)
{
cOSVersion = TEXT(“Windows XP”);
}
else if(OSVersion.dwMajorVersion == 6 && OSVersion.dwMinorVersion == 0)
{
cOSVersion = TEXT(“Windows Vista”);
}
else if(OSVersion.dwMajorVersion == 4 && OSVersion.dwMinorVersion == 0)
{
cOSVersion = TEXT(“Windows NT”);
}
else
{
cOSVersion = TEXT(“未知操作系统”);
}
break;
case VER_PLATFORM_WIN32_WINDOWS:
if(OSVersion.dwMajorVersion == 4 && OSVersion.dwMinorVersion == 10)
{
cOSVersion = TEXT(“Windows 98”);
}
else if(OSVersion.dwMajorVersion == 4 && OSVersion.dwMinorVersion == 90)
{
cOSVersion = TEXT(“Windows ME”);
}
else
{
cOSVersion = TEXT(“Windows 95”);
}
break;
default:
break;
}
SetDlgItemText(hwnd, id, cOSVersion);//显示
}
void GetUserLogicalDrives(HWND hwnd, int id)
{
DWORD dwUserLogicalDrives = GetLogicalDrives();//获取逻辑驱动器
TCHAR cUserLogicalDrives[256];//输出可用逻辑驱动器字符数组
ZeroMemory(cUserLogicalDrives, sizeof(cUserLogicalDrives));//初始化字符数组
TCHAR cTemp[3];//字符临时数组
cTemp[2] = ‘\0’;//调试发现cTemp数组初始均为’\0’,但对大的数组如cUserLogicalDrives只有部分为’\0’。
int counter = 0;//计数器
while(dwUserLogicalDrives > 0)//循环右移一位,按位&1,获取可用逻辑驱动器。
{
if(dwUserLogicalDrives & 1)
{
cTemp[0] = ‘A’+counter;//获取可用逻辑驱动器名称
cTemp[1] = 32;//空格的ASCII码
strncat(cUserLogicalDrives, cTemp, 2);
}
counter++;
dwUserLogicalDrives = dwUserLogicalDrives >> 1;
}
SetDlgItemText(hwnd, id, cUserLogicalDrives);//显示
}
void AddComboBoxItem(HWND hwnd, int id)
{
TCHAR cUserLogicalDrives[256];//输出可用逻辑驱动器字符数组
ZeroMemory(cUserLogicalDrives, sizeof(cUserLogicalDrives));//初始化字符数组
TCHAR cTemp[2];//字符临时变量
cTemp[1] = ‘\0’;
GetDlgItemText(hwnd, IDC_EDT3, cUserLogicalDrives, sizeof(cUserLogicalDrives));//获取GetUserLogicalDrives后的可用逻辑驱动器名称
int nLength = strlen(cUserLogicalDrives);//可用逻辑驱动器字符串长度
for(int i = 0; i < nLength; i += 2)//添加ComboBox项
{
cTemp[0] = cUserLogicalDrives[i];
SendDlgItemMessage(hwnd, IDC_CBO1, CB_ADDSTRING, 0, (LPARAM)&cTemp);
}
}
void CALLBACK GetDiskInfo(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)//定时器处理函数的参数形式是一定的,这是因为操作系统会填写这些参数。
{
TCHAR cDisk[3];//盘符
cDisk[2] = ‘\0’;//初始化
TCHAR cDiskInfo[256];//输出磁盘信息字符数组
ZeroMemory(cDiskInfo, sizeof(cDiskInfo));//初始化
int iIndex = SendDlgItemMessage(hwnd, IDC_CBO1, CB_GETCURSEL, 0, 0);//获取ComboBox选中项索引
HWND hIDC_CBO1 = GetDlgItem(hwnd, IDC_CBO1);//获取ComboBox句柄
if(iIndex != CB_ERR)//选中
{
SendMessage(hIDC_CBO1, CB_GETLBTEXT, iIndex, (LPARAM)cDisk);
cDisk[1] = ‘:’;//获取ComboBox选中项盘符
UINT uType = GetDriveType(cDisk);//获取磁盘类型
switch(uType)
{
case DRIVE_UNKNOWN:
lstrcpy(cDiskInfo, “未知磁盘类型\r\n”);
break;
case DRIVE_NO_ROOT_DIR:
lstrcpy(cDiskInfo, “磁盘名无效\r\n”);
break;
case DRIVE_REMOVABLE:
lstrcpy(cDiskInfo, “可移动磁盘\r\n”);
break;
case DRIVE_FIXED:
lstrcpy(cDiskInfo, “固定磁盘\r\n”);
break;
case DRIVE_REMOTE:
lstrcpy(cDiskInfo, “网络磁盘\r\n”);
break;
case DRIVE_CDROM:
lstrcpy(cDiskInfo, “光驱\r\n”);
break;
case DRIVE_RAMDISK:
lstrcpy(cDiskInfo, “RAM\r\n”);
break;
default:
lstrcpy(cDiskInfo, “GetDriveType的非法返回值\r\n”);
break;
}
ULARGE_INTEGER nFreeBytesAvailableToCaller;//可用磁盘空间
ULARGE_INTEGER nTotalNumberOfBytes;//磁盘总大小
ULARGE_INTEGER nTotalNumberOfFreeBytes;//空闲磁盘空间
TCHAR cDiskInfo2[256];//输出磁盘信息字符数组
ZeroMemory(cDiskInfo2, sizeof(cDiskInfo2));//初始化
if(GetDiskFreeSpaceEx(cDisk, &nFreeBytesAvailableToCaller, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes))//获取磁盘信息
wsprintf(cDiskInfo2, TEXT(“磁盘%s总大小:%I64dGB 空闲空间:%I64dGB 可用空间:%I64dGB”), cDisk, nTotalNumberOfBytes.QuadPart/GB, nTotalNumberOfFreeBytes.QuadPart/GB, nFreeBytesAvailableToCaller.QuadPart/GB);
else
lstrcpy(cDiskInfo2, “获取磁盘信息失败”);
lstrcat(cDiskInfo, cDiskInfo2);
SetDlgItemText(hwnd, IDC_EDT4, cDiskInfo);
}
/*注意字符串、字符串赋值、字符串连接问题
**字符串有以’\0’和NULL为终止符的字符串
**两种字符串的赋值与连接都有区别
**字符串指针赋值是字符串常量
**字符串数组声明后赋值,要使用strcpy。
*/
}
void GetMemoryInfo(HWND hwnd, int id)
{
MEMORYSTATUS memStatus;//内存状态
TCHAR cMemoryInfo[256];//输出内存状态字符串
GlobalMemoryStatus(&memStatus);//获取内存状态
wsprintf(cMemoryInfo,
TEXT(“内存使用率:%u%%MB\r\n总物理内存:%uMB\t可用物理内存:%uMB\r\n总虚拟内存:%uMB\t可用虚拟内存:%uMB\r\n总页面文件:%uMB\t可用页面文件:%uMB\r\n”),//此处不能换行是因为未设置控件MultiLine属性为true。
memStatus.dwMemoryLoad,
memStatus.dwTotalPhys/MB,
memStatus.dwAvailPhys/MB,
memStatus.dwTotalVirtual/MB,
memStatus.dwAvailVirtual/MB,
memStatus.dwTotalPageFile/MB,
memStatus.dwAvailPageFile/MB);//格式化输出。%%为输出%。
SetDlgItemText(hwnd, id, cMemoryInfo);
}
ComboBox参考:http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/caf20d4ecdc90c0fb2de055a.html
修正:
使用#define MB 1024*1024,在计算如memStatus.dwTotalPhys/MB时结果出错,是因为运算顺序的关系。使用#define MB 1024*1024和memStatus.dwTotalPhys/(MB)或使用#define MB (1024*1024)和memStatus.dwTotalPhys/MB计算时,结果正确。
内存信息也应该是实时显示:
SetTimer(hwnd, 2, 1000, GetMemoryInfo);//设置定时器,动态获取内存信息。
void CALLBACK GetMemoryInfo(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
MEMORYSTATUS memStatus;//内存状态
TCHAR cMemoryInfo[256];//输出内存状态字符串
GlobalMemoryStatus(&memStatus);//获取内存状态
wsprintf(cMemoryInfo,
TEXT(“内存使用率:%u%%MB\r\n总物理内存:%uMB\t可用物理内存:%uMB\r\n总虚拟内存:%uMB\t可用虚拟内存:%uMB\r\n总页面文件:%uMB\t可用页面文件:%uMB\r\n”),//此处不能换行是因为未设置控件MultiLine属性为true。
memStatus.dwMemoryLoad,
memStatus.dwTotalPhys/MB,
memStatus.dwAvailPhys/MB,
memStatus.dwTotalVirtual/MB,
memStatus.dwAvailVirtual/MB,
memStatus.dwTotalPageFile/MB,
memStatus.dwAvailPageFile/MB);//格式化输出。%%为输出%。
SetDlgItemText(hwnd, IDC_EDT5, cMemoryInfo);
}