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

昨日も昨日とてCLANNADやってたんだけど、壮大に寝落ちしてしまいました。さすがに3徹はきついのか・・・。ってか、そんなに必死になってやる意味が分からないな、よく考えてみれば。急がなきゃいけないものでもないんだよね・・・。エロゲーモードは正常な思考回路を失わせるのか。

それはそうと、昨日の続き。APIの組み合わせでいけるだろとは思ってたけど、DLL使う関数とかあったりと意外と面倒だった。それでも50行のコードですが。

#include <stdio.h>
#include <unistd.h>
#include <windows.h>

#define BUFSIZE 1024
DWORD (WINAPI *fpGetModuleBaseName)(HANDLE, HMODULE, LPTSTR, DWORD);
void getActiveProcInfo(void);

int main(void){
     HINSTANCE hInst;

     if((hInst = LoadLibrary("psapi.dll")) == NULL){
          return 1;
     }
     if((fpGetModuleBaseName = (DWORD (WINAPI *)(HANDLE, HMODULE, LPTSTR, DWORD))
         GetProcAddress(hInst, "GetModuleBaseNameA")) == NULL){
          return 1;
     }
     while(1){
          getActiveProcInfo();
          _sleep(1000);
     }
     FreeLibrary(hInst);
     return 0;
}

void getActiveProcInfo(void)
{
     HWND hWnd;
     DWORD pid;
     HANDLE hProc;
     char file[BUFSIZE], title[BUFSIZE];

     hWnd = GetForegroundWindow();
     
     GetWindowText(hWnd, title, BUFSIZE);
     GetWindowThreadProcessId(hWnd , &pid);
     if(!(hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
          FALSE, pid))){
          return;
     }
     fpGetModuleBaseName(hProc, NULL, file, BUFSIZE);
     CloseHandle(hProc) ;

     printf("hWnd = %d\n", hWnd);
     printf("pid  = %d\n", pid);
     printf("proc = %s\n", file);
     printf("title = %s\n", title);
     printf("-----------------------------\n");
     fflush(stdout);
}

実行結果

hWnd = 1509388
pid  = 2352
proc = Sleipnir.exe
title = はてなダイアリー - XXXannex - Sleipnir
-----------------------------
hWnd = 331718
pid  = 2816
proc = xyzzy.exe
title = getap.c - xyzzy
-----------------------------

で、後はどうにかして集計すればいい・・・のかな?

それにしても

win32 API面白いなあ。windowsってブラックボックスだと思ってるだけに、こういう実装が見えるようなシステムコール(なのか?)は楽しい。まじめに勉強しようかなあ・・・