Justin
Justin

Reputation: 1299

Is there a way to find a process id on windows in Go?

In OS package there is a FindProcess() that you can pass in the ID of the process to get a process. You can then call kill on the process but is there a way to find a process based off of the name? (In windows)

For example i would like to be able to do something like this.

p, perr := os.FindProcessByName("Itunes")
if perr != nil {
    fmt.Println(perr)
}
p.Kill()

I only need this to work on Windows.

Upvotes: 1

Views: 2906

Answers (1)

Caleb
Caleb

Reputation: 9458

It's not pretty, but you can use the w32 binding: (github.com/AllenDang/w32)

package main

import (
    "fmt"
    "github.com/AllenDang/w32"
    "unsafe"
)

func GetProcessName(id uint32) string {
    snapshot := w32.CreateToolhelp32Snapshot(w32.TH32CS_SNAPMODULE, id)
    if snapshot == w32.ERROR_INVALID_HANDLE {
        return "<UNKNOWN>"
    }
    defer w32.CloseHandle(snapshot)

    var me w32.MODULEENTRY32
    me.Size = uint32(unsafe.Sizeof(me))
    if w32.Module32First(snapshot, &me) {
        return w32.UTF16PtrToString(&me.SzModule[0])
    }

    return "<UNKNOWN>"
}

func ListProcesses() []uint32 {
    sz := uint32(1000)
    procs := make([]uint32, sz)
    var bytesReturned uint32
    if w32.EnumProcesses(procs, sz, &bytesReturned) {
        return procs[:int(bytesReturned)/4]
    }
    return []uint32{}
}

func FindProcessByName(name string) (uint32, error) {
    for _, pid := range ListProcesses() {
        if GetProcessName(pid) == name {
            return pid, nil
        }
    }
    return 0, fmt.Errorf("unknown process")
}

func main() {
    fmt.Println(FindProcessByName("chrome.exe"))
}

Upvotes: 3

Related Questions