我试过, c::Char = read(stdin, Char);
它仅在按下 Enter 键后才从键盘读取字符,而不是在每次按下/松开时。
请指导我在按下或松开按键时阅读键盘输入!
更新 1:
function quit()
print("Press q to quit!");
opt = getc1();
while true
if opt = 'q'
break;
else
continue;
end
end
end
Run Code Online (Sandbox Code Playgroud)
抛出错误:
TypeError:non-boolean(Int64) used in boolean context.
Run Code Online (Sandbox Code Playgroud)
请帮我!
这不是那么简单。
你可以试试这个更底层的解决方案:
function getc1()
ret = ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, true)
ret == 0 || error("unable to switch to raw mode")
c = read(stdin, Char)
ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, false)
c
end
Run Code Online (Sandbox Code Playgroud)
或者这个更高的级别:
function getc2()
t = REPL.TerminalMenus.terminal
REPL.TerminalMenus.enableRawMode(t) || error("unable to switch to raw mode")
c = Char(REPL.TerminalMenus.readKey(t.in_stream))
REPL.TerminalMenus.disableRawMode(t)
c
end
Run Code Online (Sandbox Code Playgroud)
取决于您的需要(或使用此处的想法编写另一个实现)。关键的挑战是“普通密钥”,如 ASCII 总是被正确处理。但是,这些解决方案在处理字符的方式上有所不同,例如'?'(某些字符较大的 UNICODE)或 UP_ARROW(当您在键盘上按向上箭头时) - 您在这里必须进行试验并决定您想要什么(或者可能就足够了让您UInt8一一读取值并手动重建您想要的内容?)。
编辑
问题在于您的quit功能。这是它应该如何定义:
function quit()
print("Press q to quit!");
while true
opt = getc1();
if opt == 'q'
break
else
continue
end
end
end
Run Code Online (Sandbox Code Playgroud)