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