アプリがアクティブな時間を測定 その3

大体できたので、マージしてみます。あと、C→C++に変更。C++ってかCとC++のちゃんぽんになってしまっていますが、まあ気にしない。

#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <windows.h>

static const int BUFSIZE = 256;

class ActiveProcInfoNode{
 public:
     ActiveProcInfoNode() : cnt(1) {};
     bool operator==(const ActiveProcInfoNode& p) const;

     HWND hWnd;
     DWORD pid;
     std::string module;
     std::string title;
     int cnt;
};
bool ActiveProcInfoNode::operator==(const ActiveProcInfoNode& p) const
{
     return ((hWnd==p.hWnd) && (pid==p.pid) && (module==p.module) 
&& (title==p.title));
}

class ActiveProcInfo{
 public:
     ActiveProcInfo(){
          if((hInstpsapi = LoadLibrary("psapi.dll")) == NULL){
               err=1; return;
          }
          if((fpGetModuleBaseName = (DWORD (WINAPI *)
(HANDLE, HMODULE, LPTSTR, DWORD))
              GetProcAddress(hInstpsapi, "GetModuleBaseNameA")) == NULL){
               err=2; return;
          }
     }
     ~ActiveProcInfo(){
          FreeLibrary(hInstpsapi);
     }
     std::vector<ActiveProcInfoNode> nodes;
     void update();

 private:
     HINSTANCE hInstpsapi;
     DWORD (WINAPI *fpGetModuleBaseName)(HANDLE, HMODULE, LPTSTR, DWORD);
     int err;
};
void ActiveProcInfo::update()
{
     HWND hWnd;
     DWORD pid;
     HANDLE hProc;
     ActiveProcInfoNode p;
     unsigned int i, N=nodes.size();
     char buf[BUFSIZE];

     hWnd = GetForegroundWindow();
     p.hWnd = hWnd;
     GetWindowText(hWnd, buf, BUFSIZE);
     p.title = buf;
     GetWindowThreadProcessId(hWnd, &pid);
     p.pid  = pid;
     if(!(hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
FALSE, pid))){
          err=3; return;
     }
     fpGetModuleBaseName(hProc, NULL, buf, BUFSIZE);
     p.module = buf;
     CloseHandle(hProc);
     // merge
     for(i=0; i<N; i++){
          if(p == nodes[i]){
               nodes[i].cnt++;
               break;
          }
     }
     if(i==N){
          nodes.push_back(p);
     }
     // print
     N=nodes.size();
     for(i=0; i<N; i++){
          printf("hWnd  = %d\n", nodes[i].hWnd);
          printf("pid   = %d\n", nodes[i].pid);
          printf("proc  = %s\n", nodes[i].module.c_str());
          printf("title = %s\n", nodes[i].title.c_str());
          printf("cnt   = %d\n", nodes[i].cnt);
          printf("-----------------------------\n");
     }
     printf("==========================\n");
     fflush(stdout);
}

int main(void){
     ActiveProcInfo ap;
     while(1){
          ap.update();
          _sleep(1000);
     }
     return 0;
}

実行結果

hWnd  = 393666
pid   = 3320
proc  = ttermpro.exe
title = getap - 127.0.0.1 (1) VT
cnt   = 2
-----------------------------
hWnd  = 198396
pid   = 2108
proc  = Sleipnir.exe
title = XXXannex - Sleipnir
cnt   = 18
-----------------------------
hWnd  = 198396
pid   = 2108
proc  = Sleipnir.exe
title = はてな ログイン - Sleipnir
cnt   = 5
-----------------------------
==========================

さて。C++にしたのはライブラリー化が簡単だから。コードは長くなるんだけどね・・・。あとは適当にGUIをつければできあがりー。

・・・GUIってどうやってつけるんだろ。