是否有办法在Go中的windows上查找进程id?

是否有办法在Go中的windows上查找进程id?,go,Go,在OS包中,有一个FindProcess(),您可以通过传入进程ID来获取进程。然后可以对进程调用kill,但是有没有一种方法可以根据名称查找进程?(在windows中) 例如,我希望能够做这样的事情 p, perr := os.FindProcessByName("Itunes") if perr != nil { fmt.Println(perr) } p.Kill() 我只需要在Windows上使用它。它并不漂亮,但您可以使用w32绑定:(github.com/allendag/

在OS包中,有一个FindProcess(),您可以通过传入进程ID来获取进程。然后可以对进程调用kill,但是有没有一种方法可以根据名称查找进程?(在windows中)

例如,我希望能够做这样的事情

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

我只需要在Windows上使用它。

它并不漂亮,但您可以使用w32绑定:(github.com/allendag/w32)

主程序包
进口(
“fmt”
“github.com/allendag/w32”
“不安全”
)
func GetProcessName(id uint32)字符串{
快照:=w32.CreateToolhelp32Snapshot(w32.TH32CS\U SNAPMODULE,id)
如果快照==w32.ERROR\u无效\u句柄{
返回“”
}
延迟w32.CloseHandle(快照)
var me w32.MODULEENTRY32
me.Size=uint32(不安全的大小(me))
如果w32.module32首先(快照和me){
返回w32.UTF16PtrToString(&me.SzModule[0])
}
返回“”
}
func listprocess()[]uint32{
sz:=uint32(1000)
过程:=make([]uint32,sz)
var字节返回uint32
如果w32.EnumProcesses(procs、sz和bytesReturned){
返回过程[:int(字节返回)/4]
}
返回[]uint32{}
}
func FindProcessByName(名称字符串)(uint32,错误){
对于,pid:=范围listprocess(){
如果GetProcessName(pid)=名称{
返回pid,零
}
}
返回0,fmt.Errorf(“未知进程”)
}
func main(){
fmt.Println(FindProcessByName(“chrome.exe”))
}

这并不漂亮,但您可以使用w32绑定:(github.com/allendag/w32)

主程序包
进口(
“fmt”
“github.com/allendag/w32”
“不安全”
)
func GetProcessName(id uint32)字符串{
快照:=w32.CreateToolhelp32Snapshot(w32.TH32CS\U SNAPMODULE,id)
如果快照==w32.ERROR\u无效\u句柄{
返回“”
}
延迟w32.CloseHandle(快照)
var me w32.MODULEENTRY32
me.Size=uint32(不安全的大小(me))
如果w32.module32首先(快照和me){
返回w32.UTF16PtrToString(&me.SzModule[0])
}
返回“”
}
func listprocess()[]uint32{
sz:=uint32(1000)
过程:=make([]uint32,sz)
var字节返回uint32
如果w32.EnumProcesses(procs、sz和bytesReturned){
返回过程[:int(字节返回)/4]
}
返回[]uint32{}
}
func FindProcessByName(名称字符串)(uint32,错误){
对于,pid:=范围listprocess(){
如果GetProcessName(pid)=名称{
返回pid,零
}
}
返回0,fmt.Errorf(“未知进程”)
}
func main(){
fmt.Println(FindProcessByName(“chrome.exe”))
}

进程的名称是什么?我使用powershell中的Get process获取正在运行的进程列表。ProcessName和there ID在表中给出。在这种情况下,我试图关闭iTunes,进程名称是iTunes。问题是进程ID一直在更改,因此我似乎无法依赖它。进程的名称是什么?我在powershell中使用Get process获取正在运行的进程列表。ProcessName和there ID在表中给出。在这种情况下,我试图关闭iTunes,进程名称是iTunes。问题是进程ID一直在变化,所以我似乎不能依赖它。
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"))
}