vmstat.dpr

来自「一本已经绝版的好书」· DPR 代码 · 共 132 行

DPR
132
字号

// Module name: VMStat.C ->> VMStat.dpr
// Notices: Copyright (c) 1995-1997 Jeffrey Richter
// Translator: 刘麻子, Liu_mazi@126.com

program VMStat;

{$R 'VMStat.res' 'VMStat.rc'}

uses
  Windows, Messages,
  Other in '..\Other.pas', CmnHdr in '..\CmnHdr.pas', WindowsX in '..\WindowsX.pas';

const
  IDD_VMSTAT        =  1;
  IDC_MEMLOAD       =  100;
  IDC_TOTALPHYS     =  101;
  IDI_VMSTAT        =  101;
  IDC_AVAILPHYS     =  102;
  IDC_TOTALPAGEFILE =  103;
  IDC_AVAILPAGEFILE =  104;
  IDC_TOTALVIRTUAL  =  105;
  IDC_AVAILVIRTUAL  =  106;

const
  IDT_UPDATE = 1; // 定时器ID

  // IntToStr()
function BigNumToString(lNum: DWORD; const szBuf: PChar): PChar;
var
  wNumDigits, wNumChars: WORD;
begin
  wNumDigits := 0; // 十进制位
  wNumChars := 0;  // 数组指针

  repeat
    // 最低位数字
    szBuf[wNumChars] := Char(lNum mod 10 + $30);
    Inc(wNumChars);

    // 隔3位加逗号
    Inc(wNumDigits);
    if (wNumDigits mod 3 = 0) then
    begin
      szBuf[wNumChars] := ',';
      Inc(wNumChars);
    end;

    // 向右移一位
    lNum := lNum div 10;
  until (lNum = 0);

  // 置结束符
  if (szBuf[wNumChars - 1] = ',') then szBuf[wNumChars - 1] := #0 else szBuf[wNumChars] := #0;

  // 反转字串
  StrRev(szBuf);

  // 方便调用
  Result := szBuf;
end;

  // WM_INITDIALOG
function Dlg_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
begin
  chSETDLGICONS(hWnd, IDI_VMSTAT, IDI_VMSTAT);

  SetTimer(hWnd, IDT_UPDATE, 1 * 1000, nil);
  SendMessage(hWnd, WM_TIMER, IDT_UPDATE, 0);

  Result := TRUE;
end;

  // WM_TIMER
procedure Dlg_OnTimer(hWnd: HWND; id: UINT);
var
  szBuf: array[0..50] of Char;
  ms: TMemoryStatus;
begin
  ms.dwLength := SizeOf(ms);
  GlobalMemoryStatus(ms);

  SetDlgItemText(hWnd, IDC_MEMLOAD, BigNumToString(ms.dwMemoryLoad, szBuf));
  SetDlgItemText(hWnd, IDC_TOTALPHYS, BigNumToString(ms.dwTotalPhys, szBuf));
  SetDlgItemText(hWnd, IDC_AVAILPHYS, BigNumToString(ms.dwAvailPhys, szBuf));
  SetDlgItemText(hWnd, IDC_TOTALPAGEFILE, BigNumToString(ms.dwTotalPageFile, szBuf));
  SetDlgItemText(hWnd, IDC_AVAILPAGEFILE, BigNumToString(ms.dwAvailPageFile, szBuf));
  SetDlgItemText(hWnd, IDC_TOTALVIRTUAL, BigNumToString(ms.dwTotalVirtual, szBuf));
  SetDlgItemText(hWnd, IDC_AVAILVIRTUAL, BigNumToString(ms.dwAvailVirtual, szBuf));
end;

  // WM_COMMAND
procedure Dlg_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
begin
  if (id = IDCANCEL) then
  begin
    KillTimer(hWnd, IDT_UPDATE);
    EndDialog(hWnd, id);
  end;
end;

  // 对话框回调
function Dlg_Proc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
  case (uMsg) of
    WM_INITDIALOG:
      begin
        Result := SetDlgMsgResult(hWnd, LRESULT(Dlg_OnInitDialog(hWnd, wParam, lParam)));
      end;

    WM_COMMAND:
      begin
        Dlg_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
        Result := TRUE;
      end;

    WM_TIMER:
      begin
        Dlg_OnTimer(hWnd, wParam);
        Result := TRUE;
      end;
      
    else Result := FALSE;
  end;
end;

  // 程序入口
begin
  chWARNIFUNICODEUNDERWIN95();
  DialogBox(HInstance, MakeIntResource(IDD_VMSTAT), 0, @Dlg_Proc);
end.

⌨️ 快捷键说明

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