Chcę uzyskać identyfikator procesu według nazwy procesu w środowisku Windows?W jaki sposób uzyskać identyfikator procesu według nazwy procesu?
Uważam, że golang ma tylko api os.FindProcess(id)
, ale nie ma nazwy.
Chcę uzyskać identyfikator procesu według nazwy procesu w środowisku Windows?W jaki sposób uzyskać identyfikator procesu według nazwy procesu?
Uważam, że golang ma tylko api os.FindProcess(id)
, ale nie ma nazwy.
Możesz wyświetlić listę wszystkich procesów i dopasować je do nazwy, którą chcesz znaleźć, używając zaktualizowanego pakietu wywołań sys, https://godoc.org/golang.org/x/sys, ma on większość api Windows.
func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error)
func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error)
również zobaczyć docs MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx
musiałem zmagać się z tym także i znaleźć sposób na rozwiązanie nie bardzo proste, ponieważ ... WinApi :)
w końcu musisz utworzyć migawkę bieżącej listy procesów Windows, używając CreateToolhelp32Snapshot
. Następnie otrzymasz pierwszy proces w migawce z Process32First
. Następnie kontynuuj iterowanie listy za pomocą Process32Next
, aż pojawi się błąd ERROR_NO_MORE_FILES
. Tylko wtedy masz całą listę procesów.
Zobacz przykładowy dokument zawierający how2readwindowsprocesses.
Oto sedno:
const TH32CS_SNAPPROCESS = 0x00000002
type WindowsProcess struct {
ProcessID int
ParentProcessID int
Exe string
}
func processes() ([]WindowsProcess, error) {
handle, err := windows.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
if err != nil {
return nil, err
}
defer windows.CloseHandle(handle)
var entry windows.ProcessEntry32
entry.Size = uint32(unsafe.Sizeof(entry))
// get the first process
err = windows.Process32First(handle, &entry)
if err != nil {
return nil, err
}
results := make([]WindowsProcess, 0, 50)
for {
results = append(results, newWindowsProcess(&entry))
err = windows.Process32Next(handle, &entry)
if err != nil {
// windows sends ERROR_NO_MORE_FILES on last process
if err == syscall.ERROR_NO_MORE_FILES {
return results, nil
}
return nil, err
}
}
}
func findProcessByName(processes []WindowsProcess, name string) *WindowsProcess {
for _, p := range processes {
if strings.ToLower(p.Exe) == strings.ToLower(name) {
return &p
}
}
return nil
}
func newWindowsProcess(e *windows.ProcessEntry32) WindowsProcess {
// Find when the string ends for decoding
end := 0
for {
if e.ExeFile[end] == 0 {
break
}
end++
}
return WindowsProcess{
ProcessID: int(e.ProcessID),
ParentProcessID: int(e.ParentProcessID),
Exe: syscall.UTF16ToString(e.ExeFile[:end]),
}
}
Można wykonać „tasklist.exe” wewnątrz programu golang i przetwarzać dane wyjściowe w golang aby znaleźć nazwę procesu. – Griffin