大体できたので、マージしてみます。あと、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ってどうやってつけるんだろ。