在Windows版本的golang中,列出当前正在运行的进程列表

8
5个回答

8

5
你需要使用Windows API函数EnumProcesses。在Windows上,syscall包使您能够加载任意DLL及其函数(即通过LoadLibrary/GetProcAddress)。因此,您可以在psapi.dll中获取EnumProcesses。这会给你一个PID列表;然后您可以使用OpenProcess和EnumProcessModules来获取进程名称。
可能已经有人完成了实现此功能的工作,但我不知道任何信息。如果找不到任何内容,请查看syscall包的源代码(例如,src/pkg/syscall/zsyscall_windows_386.go),并类似于其他Windows API函数所做的事情进行操作。

3
根据syscall包文档: 此包已被锁定。标准Go存储库之外的代码应迁移到golang.org/x/sys存储库中相应的包中。 您可以使用golang.org/x/sys/windows,其中包含Process32First和Process32Next,以枚举系统进程。

0

这似乎可以做到:

package main
import "golang.org/x/sys/windows"

// unsafe.Sizeof(windows.ProcessEntry32{})
const processEntrySize = 568

func main() {
   h, e := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPPROCESS, 0)
   if e != nil {
      panic(e)
   }
   p := windows.ProcessEntry32{Size: processEntrySize}
   for {
      e := windows.Process32Next(h, &p)
      if e != nil { break }
      s := windows.UTF16ToString(p.ExeFile[:])
      println(s)
   }
}

https://pkg.go.dev/golang.org/x/sys/windows#CreateToolhelp32Snapshot


不要忘记使用 defer windows.CloseHandle(h) - Anton Litvinov

0

如果使用Windigo(出于简洁省略了错误检查),代码会更清晰:

package main

import (
    "fmt"

    "github.com/rodrigocfd/windigo/win"
    "github.com/rodrigocfd/windigo/win/co"
)

func main() {
    pids, _ := win.EnumProcesses()

    for _, pid := range pids {
        hSnap, _ := win.CreateToolhelp32Snapshot(co.TH32CS_SNAPMODULE, pid)
        defer hSnap.CloseHandle()

        hSnap.EnumModules(func(me32 *win.MODULEENTRY32) {
            fmt.Printf("PID: %d, %s @ %s\n",
                me32.Th32ProcessID, me32.SzModule(), me32.SzExePath())
        })
    }
}

或者如果你只想要进程,而不需要模块:

package main

import (
    "fmt"

    "github.com/rodrigocfd/windigo/win"
    "github.com/rodrigocfd/windigo/win/co"
)

func main() {
    pids, _ := win.EnumProcesses()

    for _, pid := range pids {
        hSnap, _ := win.CreateToolhelp32Snapshot(co.TH32CS_SNAPPROCESS, pid)
        defer hSnap.CloseHandle()

        hSnap.EnumProcesses(func(pe32 *win.PROCESSENTRY32) {
            fmt.Printf("PID: %d @ %s\n",
                pe32.Th32ProcessID, pe32.SzExeFile())
        })
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接