windows下如何获取golang中当前正在运行的进程列表?
我需要类似的东西:
但也可以在 Windows 下使用。
我刚刚实现了您需要的功能(EnumProcess 如上所述 axw)。查看https://github.com/AllenDang/w32。您可能想等到我的拉取请求通过 :) 关于如何使用的示例:https ://gist.github.com/3083408
您需要使用 Windows API 函数EnumProcesses
。Windows 上的syscall包使您能够加载任意 DLL 及其函数(即通过 LoadLibrary/GetProcAddress)。这样你就可以进去EnumProcesses
了psapi.dll
。这为您提供了一个 PID 列表;然后,您可以使用 OpenProcess 和 EnumProcessModules 来获取进程名称。
可能有人已经完成了实现这一点的工作,但我什么都不知道。如果找不到任何东西,请查看 syscall 包的源代码(例如src/pkg/syscall/zsyscall_windows_386.go)并执行与其他 Windows API 函数类似的操作。
根据系统调用包文档:此包已锁定。应迁移标准 Go 存储库之外的代码以使用 golang.org/x/sys 存储库中的相应包。
您可以使用 golang.org/x/sys/windows,它有 Process32First 和 Process32Next 让枚举系统进程。
这似乎做到了:
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
如果您使用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())
})
}
}