8

windows下如何获取golang中当前正在运行的进程列表?

我需要类似的东西:

Golang 中当前正在运行的进程列表

但也可以在 Windows 下使用。

4

5 回答 5

8

我刚刚实现了您需要的功能(EnumProcess 如上所述 axw)。查看https://github.com/AllenDang/w32。您可能想等到我的拉取请求通过 :) 关于如何使用的示例:https ://gist.github.com/3083408

于 2012-07-10T14:03:36.250 回答
5

您需要使用 Windows API 函数EnumProcesses。Windows 上的syscall包使您能够加载任意 DLL 及其函数(即通过 LoadLibrary/GetProcAddress)。这样你就可以进去EnumProcessespsapi.dll。这为您提供了一个 PID 列表;然后,您可以使用 OpenProcess 和 EnumProcessModules 来获取进程名称。

可能有人已经完成了实现这一点的工作,但我什么都不知道。如果找不到任何东西,请查看 syscall 包的源代码(例如src/pkg/syscall/zsyscall_windows_386.go)并执行与其他 Windows API 函数类似的操作。

于 2012-07-06T06:45:52.797 回答
3

根据系统调用包文档:此包已锁定。应迁移标准 Go 存储库之外的代码以使用 golang.org/x/sys 存储库中的相应包。

您可以使用 golang.org/x/sys/windows,它有 Process32First 和 Process32Next 让枚举系统进程。

于 2016-03-31T13:58:57.750 回答
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

于 2021-05-24T20:27:24.937 回答
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())
        })
    }
}
于 2021-10-15T14:46:16.697 回答