OSDN Git Service

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