プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]μモニター情報の分割ソース(1)

2018年09月15日 22時40分02秒 | HSP講座

μモニター情報の分割ソース(1)

//------------------------------------------------------------------------------
// μモニター情報のサンプル by 科学太郎
//==============================================================================
// 新規作成日:2018-09-15 (土) 14:56:00
// 最終更新日:2018-09-15 (土) 16:48:00
//------------------------------------------------------------------------------
#cmpopt varinit     1
#packopt hide       1
#packopt name       __FILE__
#
#include "User32.as"
#include "Kernel32.as"

//--------------------------------------
// Win32API関数の呼び出し定義
//--------------------------------------
#uselib "Pdh.dll"
#func global PdhEnumObjectItems             "PdhEnumObjectItemsA"           sptr,sptr,sptr,var,var,var,var,sptr,sptr
#func global PdhOpenQuery                   "PdhOpenQueryA"                 sptr,sptr,sptr
#func global PdhCloseQuery                  "PdhCloseQuery"                 sptr
#func global PdhAddCounter                  "PdhAddCounterA"                sptr,sptr,sptr,sptr
#func global PdhCollectQueryData            "PdhCollectQueryData"           sptr
#func global PdhGetFormattedCounterValue    "PdhGetFormattedCounterValue"   sptr,sptr,sptr,sptr

//--------------------------------------
// 記号定数(API定数)
//--------------------------------------
#const global NULL                      0
#const global WM_CLOSE                  $00000010
#const global WM_TIMER                  $00000113
#const global WM_MOUSEMOVE              $00000200
#const global WM_LBUTTONDOWN            $00000201
#const global WM_NCLBUTTONDOWN          $000000A1
#const global HTCAPTION                 $00000002
#
#const global GWL_EXSTYLE               $FFFFFFEC
#const global WS_EX_TOOLWINDOW          $00000080
#
#const global SWP_NOSIZE                $00000001
#const global SWP_NOMOVE                $00000002
#const global SWP_NOZORDER              $00000004
#const global SWP_NOACTIVATE            $00000010
#const global SWP_FRAMECHANGED          $00000020
#const global SWP_SHOWWINDOW            $00000040
#const global SWP_HIDEWINDOW            $00000080
#const global SPI_GETWORKAREA           $00000030
#
#const global ERROR_SUCCESS             $00000000
#const global PDH_FMT_LONG              $00000100
#const global PDH_FMT_DOUBLE            $00000200
#const global PERF_DETAIL_WIZARD        $00000190

//--------------------------------------
// 列挙定数(MEMORYSTATUSEX)
//--------------------------------------
#enum msex_dwLength=0                   ;構造体のサイズ
#enum msex_dwMemoryLoad                 ;メモリの使用率(%)
#enum msex_ullTotalPhysLo               ;物理メモリの搭載容量
#enum msex_ullTotalPhysHi               ;
#enum msex_ullAvailPhysLo               ;物理メモリの空き容量
#enum msex_ullAvailPhysHi               ;
#enum msex_ullTotalPageFileLo           ;ページングの搭載容量
#enum msex_ullTotalPageFileHi           ;
#enum msex_ullAvailPageFileLo           ;ページングの空き容量
#enum msex_ullAvailPageFileHi           ;
#enum msex_ullTotalVirtualLo            ;仮想メモリの搭載容量
#enum msex_ullTotalVirtualHi            ;
#enum msex_ullAvailVirtualLo            ;仮想メモリの空き容量
#enum msex_ullAvailVirtualHi            ;
#enum msex_ullAvailExtendedVirtualLo    ;仮想メモリの拡張空き容量
#enum msex_ullAvailExtendedVirtualHi    ;
#enum DIM_MEMORYSTATUSEX
#enum SIZE_MEMORYSTATUSEX=(DIM_MEMORYSTATUSEX*4)

//------------------------------------------------------------------------------

//--------------------------------------
// 記号定数(フラグ値)
//--------------------------------------
#const FLAG_HDD         %000000001      ;HDDの使用率(%)
#const FLAG_CPU         %000000010      ;CPUの使用率(%)
#const FLAG_MEM         %000000100      ;物理メモリの使用率(%)
#const FLAG_VRM         %000001000      ;仮想メモリの使用率(%)
#const FLAG_PGF         %000010000      ;ページングの使用率(%)
#const FLAG_UPB         %000100000      ;ネットの送信速度(バイト/秒)
#const FLAG_DNB         %001000000      ;ネットの受信速度(バイト/秒)
#const FLAG_UP8         %010000000      ;ネットの送信速度(ビット/秒)
#const FLAG_DN8         %100000000      ;ネットの受信速度(ビット/秒)

//--------------------------------------
// 列挙定数(非表示タイプ)
//--------------------------------------
#enum HIDE_NULL=0
#enum HIDE_LFTBTM
#enum HIDE_BOTTOM
#enum HIDE_RHTBTM
#enum HIDE_LEFT
#enum HIDE_CENTER
#enum HIDE_RIGHT
#enum HIDE_LFTTOP
#enum HIDE_TOP
#enum HIDE_RHTTOP

//--------------------------------------
// マクロ命令(表示/非表示)
//--------------------------------------
#define SetShowWindow   SetWindowPos hWnd,NULL,0,0,0,0,(SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW)
#define SetHideWindow   SetWindowPos hWnd,NULL,0,0,0,0,(SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_HIDEWINDOW)

//------------------------------------------------------------------------------

//--------------------------------------
// 記号定数(全体)
//--------------------------------------
#const WID_MAIN         (0)
#const TID_CLOCK        (0)
#const TMS_CLOCK        (100)

//--------------------------------------
// マクロ変数(ワークエリア領域)
//--------------------------------------
#define cxMonitor       rcMonitor(0)
#define cyMonitor       rcMonitor(1)
#define exMonitor       rcMonitor(2)
#define eyMonitor       rcMonitor(3)

//--------------------------------------
// マクロ変数(デスクトップ矩形)
//--------------------------------------
#define cxDesktop       (0)
#define cyDesktop       (0)
#define exDesktop       (ginfo_dispX-1)
#define eyDesktop       (ginfo_dispY-1)

//--------------------------------------
// マクロ変数(ウインドウ矩形)
//--------------------------------------
#define cxWindow        (0)
#define cyWindow        (0)
#define exWindow        (ginfo_winX-1)
#define eyWindow        (ginfo_winY-1)

//--------------------------------------
// 記号定数(サイズ)
//--------------------------------------
#define     FONT_NAME   "HG明朝E"
#const int  FONT_SIZE   (14)
#const int  HALF_SIZE   (FONT_SIZE/2)
#const int  QUAD_SIZE   (FONT_SIZE/4+0.5)
#const int  DESIGN_SW   (FLAG_HDD|FLAG_CPU|FLAG_MEM|FLAG_VRM|FLAG_PGF|FLAG_UPB|FLAG_DNB|FLAG_UP8|FLAG_DN8)

//--------------------------------------
// メイン部
//--------------------------------------
*Init
    ;単位
    dim SizeUnits,9
    SizeUnits(0)=' ','K','M','G','T','P','E','Z','Y'
    ;曜日
    sdim WeekTable,7
    WeekTable(0)="日","月","火","水","木","金","土"
    ;モニター
    nHDD=99                             ;HDDの使用率(%)
    nCPU=99                             ;CPUの使用率(%)
    nMEM=99                             ;物理メモリの使用率(%)
    nVRM=99                             ;仮想メモリの使用率(%)
    nPGF=99                             ;ページングの使用率(%)
    dbUp=9999.0                         ;ネットの送信速度(バイト/秒)
    dbDn=9999.0                         ;ネットの受信速度(バイト/秒)
    ;文字列
    sdim sMonitor,100                   ;表示文字列
    sdim sMonitorChr,100                ;文字文字列
    sdim sMonitorNum,100                ;数値文字列
    ;その他
    dim nSecSave                        ;秒数保存変数
    dim nSecCount                       ;秒数カウンタ
*Main
    ;計算
    MakeMonitor sMonitor,DESIGN_SW
    x=HALF_SIZE+HALF_SIZE*strlen(sMonitor)
    y=HALF_SIZE+FONT_SIZE
    ;作成
    bgscr WID_MAIN,x,y,SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_HIDE
    font FONT_NAME,FONT_SIZE:title "μモニター情報のサンプル by 科学太郎"
    GetWindowLong hWnd,GWL_EXSTYLE
    SetWindowLong hWnd,GWL_EXSTYLE,stat|WS_EX_TOOLWINDOW
    SetWindowPos  hWnd,NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED
    ;設定
    oncmd   gosub *OnTimer,         WM_TIMER
    oncmd   gosub *OnMouseMove,     WM_MOUSEMOVE
    oncmd   gosub *OnLButton1,      WM_LBUTTONDOWN
    onkey   gosub *OnKeyBoard
    ;初期化
    InitMonitor
    InitHideWindow
    ;表示
    DrawMonitor
    gsel WID_MAIN,2
    await
    ;開始
    StartMonitor
    if(stat==0):dialog "パフォーマンス・カウンタの初期化に失敗しました。",1,"確認":end
    InfoMonitor
    SetTimer hWnd,TID_CLOCK,TMS_CLOCK,NULL
    SendMsg  hWnd,WM_TIMER,TID_CLOCK,NULL
    stop
//--------------------------------------
// WM_TIMERメッセージの処理
//--------------------------------------
*OnTimer
    redraw 0
    n=gettime(6)
    if(n!=nSecSave):nSecSave=n:nSecCount=0
    repeat 1
        if(nSecCount==0):DrawMonitor:break
        if(nSecCount==1):
        if(nSecCount==2):
        if(nSecCount==3):
        if(nSecCount==4):
        if(nSecCount==5):
        if(nSecCount==6):
        if(nSecCount==7):
        if(nSecCount==8):InfoMonitor:break
    loop
    ;0.2秒単位
    if(nSecCount & 1)==0{
        TimerShowWindow 50
    }
    ;0.1秒単位
    nSecCount++
    redraw 1
    return 0
//--------------------------------------
// WM_MOUSEMOVEメッセージの処理
//--------------------------------------
*OnMouseMove
    MouseHideWindow
    return 0
//--------------------------------------
// WM_LBUTTONDOWNメッセージの処理
//--------------------------------------
*OnLButton1
    SendMsg hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0
    ClipDragWindow ginfo_sizeY
    return 0
//--------------------------------------
// キーボードの割り込み処理
//--------------------------------------
*OnKeyBoard
    if(iParam=='Q'):PostMessage hWnd,WM_CLOSE,0,0
    return
//--------------------------------------
// ウインドウ非表示の初期化
//--------------------------------------
#deffunc InitHideWindow
    dim ConvTable,16
    n=-1
    n++:ConvTable(n)=HIDE_CENTER        ;%0000=中央
    n++:ConvTable(n)=HIDE_LEFT          ;%0001=左側
    n++:ConvTable(n)=HIDE_RIGHT         ;%0010=右側
    n++:ConvTable(n)=HIDE_NULL          ;%0011=※左右に広いウインドウ(中央)
    n++:ConvTable(n)=HIDE_TOP           ;%0100=上側
    n++:ConvTable(n)=HIDE_LFTTOP        ;%0101=左上
    n++:ConvTable(n)=HIDE_RHTTOP        ;%0110=右上
    n++:ConvTable(n)=HIDE_NULL          ;%0111=※左右に広いウインドウ(上側)
    n++:ConvTable(n)=HIDE_BOTTOM        ;%1000=下側
    n++:ConvTable(n)=HIDE_LFTBTM        ;%1001=左下
    n++:ConvTable(n)=HIDE_RHTBTM        ;%1010=右下
    n++:ConvTable(n)=HIDE_NULL          ;%1011=※左右に広いウインドウ(下側)
    n++:ConvTable(n)=HIDE_NULL          ;%1100=※上下に広いウインドウ(中央)
    n++:ConvTable(n)=HIDE_NULL          ;%1101=※上下に広いウインドウ(左側)
    n++:ConvTable(n)=HIDE_NULL          ;%1110=※上下に広いウインドウ(右側)
    n++:ConvTable(n)=HIDE_NULL          ;%1111=※デスクトップよりも広いウインドウ
    return
//--------------------------------------
// ウインドウ非表示の開始
//--------------------------------------
#deffunc MouseHideWindow
    IsWindowVisible hWnd
    if(stat){
        ;カーソル位置
        x=1
        y=1
        if(ginfo_mx==cxDesktop):x=0
        if(ginfo_mx==exDesktop):x=2
        if(ginfo_my==cyDesktop):y=2
        if(ginfo_my==eyDesktop):y=0
        n=(y*3+x)+1
        if(n==5):return
        ;ウインドウ位置
        m=%0000
        if(ginfo_wx1<=cxDesktop)and(cxDesktop<=ginfo_wx2):m|=%0001;左側
        if(ginfo_wx1<=exDesktop)and(exDesktop<=ginfo_wx2):m|=%0010;右側
        if(ginfo_wy1<=cyDesktop)and(cyDesktop<=ginfo_wy2):m|=%0100;上側
        if(ginfo_wy1<=eyDesktop)and(eyDesktop<=ginfo_wy2):m|=%1000;下側
        ;非表示判定
        if(ConvTable(m)==n):SetHideWindow
    }
    return
//--------------------------------------
// ウインドウ非表示の復帰
//--------------------------------------
#deffunc TimerShowWindow int _gap_
    IsWindowVisible hWnd
    if(stat==0){
        if(ginfo_mx)<(ginfo_wx1-(_gap_)):SetShowWindow:return
        if(ginfo_mx)>(ginfo_wx2+(_gap_)):SetShowWindow:return
        if(ginfo_my)<(ginfo_wy1-(_gap_)):SetShowWindow:return
        if(ginfo_my)>(ginfo_wy2+(_gap_)):SetShowWindow:return
    }
    return
//--------------------------------------
// 画面外補正と画面端吸着
//--------------------------------------
#deffunc ClipDragWindow int _gap_
    dim rcMonitor,4
    SystemParametersInfo SPI_GETWORKAREA,0,varptr(rcMonitor),0
    ;初期値
    x=(ginfo_wx1)
    y=(ginfo_wy1)
    ;画面外補正
    if(ginfo_wx1<cxMonitor):x=(cxMonitor)
    if(ginfo_wy1<cyMonitor):y=(cyMonitor)
    if(ginfo_wx2>exMonitor):x=(exMonitor-ginfo_sizeX)
    if(ginfo_wy2>eyMonitor):y=(eyMonitor-ginfo_sizeY)
    ;画面端吸着
    if(cxMonitor<ginfo_wx1)and(ginfo_wx1<cxMonitor+(_gap_)):x=(cxMonitor)
    if(exMonitor>ginfo_wx2)and(ginfo_wx2>exMonitor-(_gap_)):x=(exMonitor-ginfo_sizeX)
    if(cyMonitor<ginfo_wy1)and(ginfo_wy1<cyMonitor+(_gap_)):y=(cyMonitor)
    if(eyMonitor>ginfo_wy2)and(ginfo_wy2>eyMonitor-(_gap_)):y=(eyMonitor-ginfo_sizeY)
    ;移動
    SetWindowPos hWnd,NULL,x,y,0,0,SWP_NOSIZE|SWP_NOZORDER
    return

このソースは長くブログの文字数を超えたため分割しました。
続きはμモニター情報のソース(2)をどうぞ。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]μモニター情報のソース | トップ | [HSP]μモニター情報の分割... »
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事