我刚刚实现了你需要的功能(如axw上面所述的EnumProcess函数)。 请查看https://github.com/AllenDang/w32。你可能要等到我的pull request通过 :) 一个如何使用的例子:https://gist.github.com/3083408
EnumProcesses
。在Windows上,syscall包使您能够加载任意DLL及其函数(即通过LoadLibrary/GetProcAddress)。因此,您可以在psapi.dll
中获取EnumProcesses
。这会给你一个PID列表;然后您可以使用OpenProcess和EnumProcessModules来获取进程名称。这似乎可以做到:
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())
})
}
}
defer windows.CloseHandle(h)
。 - Anton Litvinov