vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go
changeset 265 05c40b36d3b2
parent 264 8f478162d991
child 266 80973a656b81
equal deleted inserted replaced
264:8f478162d991 265:05c40b36d3b2
     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 }