3 回答
TA贡献1784条经验 获得超2个赞
在阅读 os.Stdin.Read() 并找到这个答案后,我创建了以下代码:
package main
import (
"fmt"
"os"
"time"
"os/exec"
)
func main() {
ch := make(chan string)
go func(ch chan string) {
// disable input buffering
exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
// do not display entered characters on the screen
exec.Command("stty", "-F", "/dev/tty", "-echo").Run()
var b []byte = make([]byte, 1)
for {
os.Stdin.Read(b)
ch <- string(b)
}
}(ch)
for {
select {
case stdin, _ := <-ch:
fmt.Println("Keys pressed:", stdin)
default:
fmt.Println("Working..")
}
time.Sleep(time.Millisecond * 100)
}
}
这就像一个魅力。
TA贡献1826条经验 获得超6个赞
因为你正在使用ReadString
which 期望你给它的任何参数,在你的情况下 - 关键return
。根据文档:
ReadString 一直读取到输入中第一次出现 delim,返回一个包含数据的字符串,直到并包括分隔符。
这意味着在您按下该键之前,该方法不会返回return
。
您可以改用常规的Read方法来读取您需要的字符。
TA贡献1851条经验 获得超5个赞
如果你想检查是否按下了某个键而不阻塞它所在的进程,你应该使用这样的东西:
import (
...
"golang.org/x/sys/windows"
)
var user32_dll = windows.NewLazyDLL("user32.dll")
var GetKeyState = user32_dll.NewProc("GetKeyState")
func wasESCKeyPressed() bool {
r1, _, _ := GetKeyState.Call(27) // Call API to get ESC key state.
return r1 == 65409 // Code for KEY_UP event of ESC key.
}
func loop() {
for {
// Do something...
if wasESCKeyPressed() {
break
}
// Do something...
time.Sleep(time.Millisecond * 10)
}
}
- 3 回答
- 0 关注
- 163 浏览
添加回答
举报