Windows优化大师V1.0

18 7 月, 2009

全局变量:

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

Windows优化大师V1.0

修正:

使用#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);
}

Windows优化大师V1.0修正

Disk

16 7 月, 2009

初始化对话框:

    TCHAR cBuffer[256];
    DWORD nSize = sizeof(cBuffer);
    ZeroMemory(cBuffer, nSize);
    GetUserName(cBuffer, &nSize);//获取用户信息
    MessageBox(NULL, cBuffer, TEXT(“用户信息”), MB_OK);
    GetOsVersion();//获取系统版本信息
    DWORD nSeconds = GetTickCount();
    ZeroMemory(cBuffer, nSize);
    wsprintf(cBuffer, “系统已启动%d秒”, nSeconds/1000);//获取系统启动时间
    MessageBox(NULL, cBuffer, TEXT(“系统信息”), MB_OK);
 GetDiskType(“C:”); //获取磁盘C类型
    GetDiskFreeSpaceInfo(“C:”);//获取磁盘C空间信息

自定义函数:

void GetOsVersion()
{
    OSVERSIONINFO osvi;
    TCHAR* strOSVersion;
    ZeroMemory(&osvi, sizeof(osvi));
    osvi.dwOSVersionInfoSize = sizeof(osvi);
    GetVersionEx(&osvi);
    //首先判断是NT架构的还是旧架构
    switch(osvi.dwPlatformId)
    {
    case VER_PLATFORM_WIN32_NT:
        if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
        {
            strOSVersion = TEXT(“Windows 2000”);
        }
        else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
        {
            strOSVersion = TEXT(“Windows XP”);
        }
        else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)   
        {
         strOSVersion = TEXT(“Windows Vista”);  
        }
        else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
        {
            strOSVersion = TEXT(“Windows NT”);
        }
        break;
    case  VER_PLATFORM_WIN32_WINDOWS:
        if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
        {
            strOSVersion = TEXT(“Windows 98”);
        }
        else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
        {
            strOSVersion = TEXT(“Windows ME”);
        }
        else
        {
            strOSVersion = TEXT(“Windows 95”);
        }
        break;
    default:
        break;
 }
 MessageBox(NULL,strOSVersion, TEXT(“系统信息”), MB_OK);
}

void GetDiskType(LPCTSTR lpRootPathName)
{
 UINT uType = GetDriveType(lpRootPathName);               
  switch(uType)
 {
  case DRIVE_UNKNOWN:
   MessageBox(NULL,TEXT(“未知磁盘类型”),””,MB_OK);
   break;
  case DRIVE_NO_ROOT_DIR:
   MessageBox(NULL,TEXT(“磁盘名无效”),””,MB_OK);
   break;
     case DRIVE_REMOVABLE:
            MessageBox(NULL,TEXT(“可移动磁盘”),””,MB_OK);
   break;
  case DRIVE_FIXED:
   MessageBox(NULL,TEXT(“固定磁盘”),””,MB_OK);
     break;
  case DRIVE_REMOTE:
   MessageBox(NULL,TEXT(“网络磁盘”),””,MB_OK);
    break;
  case DRIVE_CDROM:
   MessageBox(NULL,TEXT(“光驱”),””,MB_OK);
   break;
  case DRIVE_RAMDISK:
   MessageBox(NULL,TEXT(“RAM”),””,MB_OK);
   break;
  default:
   MessageBox(NULL,TEXT(“GetDriveType的非法返回值”),””,MB_OK);
 }
}

void GetDiskFreeSpaceInfo(LPCSTR lpDirectoryName)
{
    ULARGE_INTEGER nFreeBytesAvailableToCaller;
    ULARGE_INTEGER nTotalNumberOfBytes;
    ULARGE_INTEGER nTotalNumberOfFreeBytes;
    if(GetDiskFreeSpaceEx(lpDirectoryName, &nFreeBytesAvailableToCaller, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes))
    { 
     TCHAR cInfo[256];
     wsprintf(cInfo, “磁盘%s总大小:%I64dG 空闲空间:%I64dG 可用空间:%I64dG”, lpDirectoryName, nTotalNumberOfBytes.QuadPart/1024/1024/1024, nTotalNumberOfFreeBytes.QuadPart/1024/1024/1024, nFreeBytesAvailableToCaller.QuadPart/1024/1024/1024);
     MessageBox(NULL, cInfo, TEXT(“磁盘信息”), MB_OK);
    }
    else
    {
     MessageBox(NULL, TEXT(“获取磁盘信息失败”), TEXT(“错误”), MB_OK | MB_ICONASTERISK);
    }
}

关于ULARGE_INTEGER:

http://www.rupeng.com/forum/thread-409-1-1.html

http://blog.csdn.net/feilong0519/archive/2008/10/26/3153010.aspx

Clock

14 7 月, 2009

初始化对话框时设置定时器SetTimer(hwnd, 1, 1000, TimerProc);

时间到后回调的处理函数:

VOID CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
 SYSTEMTIME stTime;
 GetLocalTime(&stTime);
 TCHAR cResult[256];
 wsprintf(cResult, TEXT(“%d-%02d-%02d %02d:%02d:%02d”), stTime.wYear, stTime.wMonth, stTime.wDay, stTime.wHour, stTime.wMinute, stTime.wSecond);
 SetDlgItemText(hwnd, IDC_EDTTIME, cResult);
}

wsprintf参考资料:http://baike.baidu.com/view/849487.htm

Clock

JDK安装配置

14 7 月, 2009

登陆http://java.sun.com/,在Downloads里选择Java SE(标准版。另有Java EE、Java ME、JavaFX,分别是企业级、电子设备、网络应用平台。),选择Windows平台下的JDK版本。下载,安装。

设置环境变量。我的电脑,右键,属性,高级,环境变量。

环境变量分为用户变量和系统变量,在系统变量里设置PATH和CLASSPATH两个环境变量的值。有则编辑PATH环境变量,以“;”隔开,在其后添加Java安装路径下的两个bin文件路径,如一般默认安装则填写

C:\Program Files\Java\jdk1.6.0_14\bin;

C:\Program Files\Java\jdk1.6.0_14\jre\bin

编辑CLASSPATH环境变量,以“;”隔开,在其后添加以下内容:

.;

C:\Program Files\Java\jdk1.6.0_14\lib;

C:\Program Files\Java\jdk1.6.0_14\lib\tools.jar

(注意不要忘记第一个“.”号)没有PATH和CLASSPATH环境变量则需新建这两个环境变量。添加内容与修改内容一致。

在cmd里运行javac命令,如有相关信息,则表明配置成功。

ComboBox

13 7 月, 2009

ComboBox(下拉菜单)控件在资源编辑器里进行设置。但它的项的添加、删除以及其他处理需要通过函数来实现。

SetDlgItemMessage

  函数功能:该函数把一个消息发送给指定的对话框中的控制。

  函数原型:LONG SendDlgItemMessage(

  HWND hDlg, // handle of dialog box

  int nIDDlgItem, // identifier of control

  UINT Msg, // message to send

  WPARAM wParam, // first message parameter

  LPARAM lParam // second message parameter

  );

  参数:

  hDlg:指定含有控制的对话框。

  nIDDigItem:指定接收消息的控制的标识符。

  Msg:指定将被发送的消息。

  wParam:指定消息特定的其他信息。

  lParam:指定消息特定的其他信息。

  返回值:返回值指定消息处理的结果,且依赖于发送的消息。

  备注:SendDlgItemMessage函数直到消息已经被处理时才返回。

  使用SendDlgItemMessage函数同从一个指定的控制中检索句柄和调用SendMessagge函数一样。

  速查:WindowsNT3.1及以上版本;Windows95及以上版本;WindowsCE1.0及以上版本;头文件:winuser.h;库文件:user32.lib Unicode:在Windows NT上实现为UnicodeANSI两种版本。

ComboBox的操作

添加项:

填入Combo最简单的方法是借助CB_ADDSTRING消息:SendDlgItemMessage (hwnd,IDC_CBO1, CB_ADDSTRING, 0, (LPARAM) szString) ;

确定目前选项的索引:iIndex = SendDlgItemMessage (hwnd,IDC_CBO1, CB_GETCURSEL, 0, 0) ;如果没有项目被选中,那么从函数中传回的iIndex值为CB_ERR

删除项:

在指定索引值的同时使用LB_DELETESTRING参数,可以从项清单中删除对应项:SendDlgItemMessage (hwnd,IDC_CBO1, LB_DELETESTRING, iIndex, 0) ;

取得有多少项:

iCount = SendDlgItemMessage (hwnd,IDC_CBO1, LB_GETCOUNT, 0, 0) ;

选定某一项SendDlgItemMessage (hwnd,IDC_CBO1, LB_SETCURSEL, iIndex, 0) ;iParam设定为-1则取消所有选择。