2016-03-31 13 views

Odpowiedz

1

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

1

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]), 
    } 
} 
Powiązane problemy