int SelfProcessCount()
{
	WCHAR szModulePath[MAX_PATH];
	{
		GetModuleFileNameW(0, szModulePath, _countof(szModulePath));
		WCHAR szDrive[_MAX_DRIVE];
		WCHAR szDirectory[_MAX_DIR];
		WCHAR szFile[_MAX_FNAME];
		WCHAR szExt[_MAX_EXT];
		_wsplitpath_s(szModulePath, szDrive, _MAX_DRIVE, szDirectory, _MAX_DIR, szFile, _MAX_FNAME, szExt, _MAX_EXT);
		WCHAR szDosDevice[MAX_PATH];
		QueryDosDeviceW(szDrive, szDosDevice, _countof(szDosDevice));
		lstrcpyW(szModulePath, szDosDevice);
		lstrcatW(szModulePath, szDirectory);
		lstrcatW(szModulePath, szFile);
		lstrcatW(szModulePath, szExt);
	}
	int nCount = 0;
	DWORD dwProcessID[1024], dwNeeded;
	if (EnumProcesses(dwProcessID, sizeof(dwProcessID), &dwNeeded))
	{
		const DWORD dwProcessCount = dwNeeded / sizeof(DWORD);
		for (DWORD i = 0; i < dwProcessCount; i++)
		{
			WCHAR szNameProc[MAX_PATH];
			HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID[i]);
			if (hProcess)
			{
				if (GetProcessImageFileNameW(hProcess, szNameProc, _countof(szNameProc)) != 0)
				{
					if (lstrcmpiW(szNameProc, szModulePath) == 0)
					{
						nCount++;
					}
				}
				CloseHandle(hProcess);
			}
		}
	}
	return nCount;
}

※同プロセスかどうか判定するために実行ファイルパスを使っていますので、同じ EXE でも異なるファイルパスから起動された場合には使えません。また、複数人が同時に OS にサインインしている場合も想定されていません。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です