Toolhelp32(DelphではTlHelp32)が使える環境では
比較的簡単ですが、
procedure TForm1.Button2Click(Sender: TObject); var ProcEntry : TProcessEntry32W; SanpshotHandle : THandle; begin //Toolhelp32を使用する例 SanpshotHandle := TlHelp32.CreateToolhelp32Snapshot(TlHelp32.TH32CS_SNAPPROCESS,0); if (SanpshotHandle <> -1) then begin ListBox1.Items.Clear; ProcEntry.dwSize := Sizeof(TProcessEntry32W); if (TlHelp32.Process32First(SanpshotHandle, ProcEntry)) Then begin repeat ListBox1.Items.Add(ProcEntry.szExeFile); until (TlHelp32.Process32Next(SanpshotHandle,ProcEntry) = false); end; end; CloseHandle(SanpshotHandle); end;
使えない環境(といいても、4.0以下のNTだけですが・・・)だと
大変です。
procedure TForm1.Button1Click(Sender: TObject); var cb : Cardinal; elements : Cardinal; Needs : Cardinal; ProcIdArray : Array of DWORD; Win32Ret : LongBool; i : Cardinal; ProcHandle : THandle; OpenMode : THandle; ProcessName : String; begin //プロセス数がいくつあるか解らないので大きめにとっておく elements := 128; Needs := elements * Sizeof(DWORD); cb := 0; while (cb <= Needs) do begin SetLength(ProcIdArray, elements); cb := Length(ProcIdArray) * Sizeof(DWORD); Needs := 0; Win32Ret := PsApi.EnumProcesses(PDWORD(ProcIdArray),cb,Needs); //APIが失敗したら抜ける if (not(Win32Ret)) then begin break; end; //領域が足りなかったときに備えて倍にする。 elements := elements * 2; end; if (Win32Ret) then begin ListBox1.Items.Clear; OpenMode := Windows.PROCESS_QUERY_INFORMATION or Windows.PROCESS_VM_READ; elements := Needs div Sizeof(DWORD); for i := 0 to elements - 1 do begin //プロセスIDから情報をえる ProcHandle := Windows.OpenProcess(OpenMode,FALSE,ProcIdArray[i]); if (ProcHandle <> 0) then begin ProcessName := GetProcessName(ProcHandle); if (Length(ProcessName) > 0) then begin ListBox1.Items.Add(ProcessName); end; end; Windows.CloseHandle(ProcHandle); end; end; end; function TForm1.GetProcessName(ProcessHandle: THandle): String; var cb : Cardinal; elements : Cardinal; Needs : Cardinal; ModuleHandleArray : Array of THandle; Win32Ret : LongBool; i : longint; ModuleHandle: THandle; ModuleName : WideString; ModeleNameLength : Integer; ProcessName : String; FileExt : String; begin Result := ''; //モジュール数数がいくつあるか解らないので大きめにとっておく elements := 128; Needs := elements * Sizeof(DWORD); cb := 0; while (cb <= Needs) do begin SetLength(ModuleHandleArray, elements); cb := Length(ModuleHandleArray) * Sizeof(DWORD); Needs := 0; Win32Ret := PsApi.EnumProcessModules(ProcessHandle,PDWORD(ModuleHandleArray),cb,Needs); //APIが失敗したら抜ける if (not(Win32Ret)) then begin break; end; //領域が足りなかったときに備えて倍にする。 elements := elements * 2; end; if (Win32Ret) then begin ModeleNameLength := 255; SetLength(ModuleName,ModeleNameLength); elements := Needs div Sizeof(DWORD); for i := 0 to elements - 1 do begin ModuleHandle := ModuleHandleArray[i]; ModeleNameLength := PsApi.GetModuleBaseName( ProcessHandle, ModuleHandle, PWideChar(ModuleName), ModeleNameLength); if (ModeleNameLength > 0) then begin //モジュール名がExeファイルであればプロセスとみなす。 SetLength(ModuleName,ModeleNameLength); ProcessName := ModuleName; FileExt := ExtractFileExt(ProcessName); if (CompareText(FileExt,'.EXE') = 0) then begin Result := ProcessName; break; end; end; end; end; end;
0 件のコメント:
コメントを投稿