C++Windowsの下でプロセス名に基づいてプロセスIDとそのプロセスの下のすべてのウィンドウのハンドルを取得する
3429 ワード
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct EnumHWndsArg
{
std::vector *vecHWnds;
DWORD dwProcessId;
}EnumHWndsArg, *LPEnumHWndsArg;
void ReadF(char* str, char* buffer)
{
HANDLE pfile;
pfile = ::CreateFile(str, GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (pfile == INVALID_HANDLE_VALUE)
{
cout << " " << endl;;
CloseHandle(pfile); //
return;
}
DWORD filesize = GetFileSize(pfile, NULL);
DWORD readsize;
ReadFile(pfile, buffer, filesize, &readsize, NULL);
buffer[filesize] = 0;
CloseHandle(pfile); //
DeleteFile(str);
}
void WriteF(char* str, const char* buffer, int size)
{
HANDLE pfile;
pfile = ::CreateFile(str, GENERIC_WRITE|GENERIC_READ, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN|FILE_FLAG_WRITE_THROUGH, NULL);
if (pfile == INVALID_HANDLE_VALUE)
{
cout << " " << endl;;
CloseHandle(pfile); //
return;
}
DWORD readsize;
WriteFile(pfile, buffer, size, &readsize, NULL);
CloseHandle(pfile); //
DeleteFile(str);
}
HANDLE GetProcessHandleByID(int nID)// ID
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, nID);
}
DWORD GetProcessIDByName(const char* pName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot) {
return NULL;
}
PROCESSENTRY32 pe = { sizeof(pe) };
for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {
if (strcmp(pe.szExeFile, pName) == 0) {
CloseHandle(hSnapshot);
return pe.th32ProcessID;
}
//printf("%-6d %s
", pe.th32ProcessID, pe.szExeFile);
}
CloseHandle(hSnapshot);
return 0;
}
BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam)
{
EnumHWndsArg *pArg = (LPEnumHWndsArg)lParam;
DWORD processId;
GetWindowThreadProcessId(hwnd, &processId);
if (processId == pArg->dwProcessId)
{
pArg->vecHWnds->push_back(hwnd);
//printf("%p
", hwnd);
}
return TRUE;
}
void GetHWndsByProcessID(DWORD processID, std::vector &vecHWnds)
{
EnumHWndsArg wi;
wi.dwProcessId = processID;
wi.vecHWnds = &vecHWnds;
EnumWindows(lpEnumFunc, (LPARAM)&wi);
}
int32_t main()
{
DWORD pid = GetProcessIDByName("notepad++.exe");
printf("pid = %u
", pid);
char strPid[5];
sprintf_s(strPid, 5, "%u", pid);
char fileName[10] = "pid.cfg";
char snPid[5] = {};
ReadF(fileName, snPid);
if(strncmp(snPid, "", strlen(snPid)) == 0) {
WriteF(fileName, strPid, strlen(strPid));
}
else {
ReadF(fileName, snPid);
}
if (pid != 0)
{
std::vector vecHWnds;
GetHWndsByProcessID(pid, vecHWnds);
printf("vecHWnds.size() = %u
", vecHWnds.size());
for (const HWND &h : vecHWnds)
{
HWND parent = GetParent(h);
if (parent == NULL)
{
printf("%p --->Main Wnd
", h);
}
else
{
printf("%p %p
", h, parent);
}
}
}
char szPid[5] = "";
ReadF(fileName, szPid);
printf("[ReadF] szPid:%s
", szPid);
getchar();
return S_OK;
}