1package mousetrap
2
3import (
4 "syscall"
5 "unsafe"
6)
7
8func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
9 snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
10 if err != nil {
11 return nil, err
12 }
13 defer syscall.CloseHandle(snapshot)
14 var procEntry syscall.ProcessEntry32
15 procEntry.Size = uint32(unsafe.Sizeof(procEntry))
16 if err = syscall.Process32First(snapshot, &procEntry); err != nil {
17 return nil, err
18 }
19 for {
20 if procEntry.ProcessID == uint32(pid) {
21 return &procEntry, nil
22 }
23 err = syscall.Process32Next(snapshot, &procEntry)
24 if err != nil {
25 return nil, err
26 }
27 }
28}
29
30// StartedByExplorer returns true if the program was invoked by the user double-clicking
31// on the executable from explorer.exe
32//
33// It is conservative and returns false if any of the internal calls fail.
34// It does not guarantee that the program was run from a terminal. It only can tell you
35// whether it was launched from explorer.exe
36func StartedByExplorer() bool {
37 pe, err := getProcessEntry(syscall.Getppid())
38 if err != nil {
39 return false
40 }
41 return "explorer.exe" == syscall.UTF16ToString(pe.ExeFile[:])
42}