/
ui_windows.go
45 lines (34 loc) · 950 Bytes
/
ui_windows.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// +build windows
package terminal
import (
"os"
"syscall"
)
// see SetConsoleMode documentation for bit flags
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx
const EnableEchoInput = 0x0004
func (ui terminalUI) AskForPassword(prompt string, args ...interface{}) (passwd string) {
hStdin := syscall.Handle(os.Stdin.Fd())
var originalMode uint32
err := syscall.GetConsoleMode(hStdin, &originalMode)
if err != nil {
return
}
var newMode = uint32(originalMode &^ EnableEchoInput)
err = setConsoleMode(hStdin, newMode)
defer setConsoleMode(hStdin, originalMode)
defer ui.Say("")
if err != nil {
return
}
return ui.Ask(prompt, args...)
}
func setConsoleMode(console syscall.Handle, mode uint32) (err error) {
dll := syscall.MustLoadDLL("kernel32")
proc := dll.MustFindProc("SetConsoleMode")
r, _, err := proc.Call(uintptr(console), uintptr(mode))
if r == 0 {
return err
}
return nil
}