Windows環境でプロセスIDでプロセスIDを取得したいのですか?プロセス名でプロセスidを取得する方法はありますか?
私はgolangがapi os.FindProcess(id)
しか持っていないが、名前は見つからないことがわかりました。
Windows環境でプロセスIDでプロセスIDを取得したいのですか?プロセス名でプロセスidを取得する方法はありますか?
私はgolangがapi os.FindProcess(id)
しか持っていないが、名前は見つからないことがわかりました。
更新されたsys呼び出しパッケージhttps://godoc.org/golang.org/x/sys、 を使用して、すべてのプロセスを一覧表示し、検索する名前と一致させることができます。ほとんどのWindows APIがあります。
func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error)
func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error)
また、MSDNのドキュメントを参照してください。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx
ので... WINAPI私は、あまりにもこれと格闘しなければならなかった、と解決への道ではない非常に簡単に見つけ:)
を最後にCreateToolhelp32Snapshot
を使用して現在のWindowsプロセスリストのスナップショットを作成する必要があります。次に、Process32First
でスナップショットの最初のプロセスを取得します。その後、ERROR_NO_MORE_FILES
エラーが発生するまで、Process32Next
でリストを繰り返し処理します。それだけであなたはプロセスリスト全体を持っています。
実例はhow2readwindowsprocessesを参照してください。ここで
は、要旨次のとおりです。
const TH32CS_SNAPPROCESS = 0x00000002
type WindowsProcess struct {
ProcessID int
ParentProcessID int
Exe string
}
func processes() ([]WindowsProcess, error) {
handle, err := windows.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
if err != nil {
return nil, err
}
defer windows.CloseHandle(handle)
var entry windows.ProcessEntry32
entry.Size = uint32(unsafe.Sizeof(entry))
// get the first process
err = windows.Process32First(handle, &entry)
if err != nil {
return nil, err
}
results := make([]WindowsProcess, 0, 50)
for {
results = append(results, newWindowsProcess(&entry))
err = windows.Process32Next(handle, &entry)
if err != nil {
// windows sends ERROR_NO_MORE_FILES on last process
if err == syscall.ERROR_NO_MORE_FILES {
return results, nil
}
return nil, err
}
}
}
func findProcessByName(processes []WindowsProcess, name string) *WindowsProcess {
for _, p := range processes {
if strings.ToLower(p.Exe) == strings.ToLower(name) {
return &p
}
}
return nil
}
func newWindowsProcess(e *windows.ProcessEntry32) WindowsProcess {
// Find when the string ends for decoding
end := 0
for {
if e.ExeFile[end] == 0 {
break
}
end++
}
return WindowsProcess{
ProcessID: int(e.ProcessID),
ParentProcessID: int(e.ParentProcessID),
Exe: syscall.UTF16ToString(e.ExeFile[:end]),
}
}
あなたのgolangプログラム内部の「tasklist.exe」を実行し、プロセス名を見つけるためにgolangで出力を処理することができます。 – Griffin