infinite icon indicating copy to clipboard operation
infinite copied to clipboard

运行程序后方向键不可用

Open shiluanzzz opened this issue 2 years ago • 8 comments

  • 在使用仓库提供的demo,执行前方向键可以正常使用,执行后方向键不可用,会被识别成[[A字符 image

  • windows终端,winterm, cmd下都出现了这个问题。

  • 编译成可执行文件后在执行同样出现。

  • go version go1.18.1 windows/amd64

shiluanzzz avatar Aug 17 '22 10:08 shiluanzzz

这个切换的key是tab

fzdwx avatar Aug 17 '22 10:08 fzdwx

ok, 更新了0.8.3 https://github.com/fzdwx/infinite/commit/14bad27c370dae8826f2fe3292b0066d3b5818d8 有help view了。

fzdwx avatar Aug 17 '22 10:08 fzdwx

这个切换key是tab了解,但是我运行这个程序后,已经结束了。在终端中就没法使用方向键了。按方向键会被识别成^[[A等字符。这个问题没有复现吗?

shiluanzzz avatar Aug 17 '22 10:08 shiluanzzz

cmd是吧,我试试

fzdwx avatar Aug 17 '22 10:08 fzdwx

ok,我也出现了,我看看

fzdwx avatar Aug 17 '22 10:08 fzdwx

@shiluanzzz 我好像找到原因了,跟这个方法有关https://github.com/muesli/cancelreader/blob/main/cancelreader_windows.go#L189

现在有一个简单的修复办法,你可以运行完demo之后在运行:

func main() {
	var originalMode uint32
	windows.SetConsoleMode(windows.Handle(os.Stdin.Fd()), originalMode)
}

我晚上想想怎么写。

fzdwx avatar Aug 17 '22 11:08 fzdwx

问题很诡异。 跟 window#GetConsoleMode 这个函数有关,当这个框架的程序运行时读取到的值是992, 但是默认的却是 503。就会导致这个情况出现。如果要改的话,只能强行把这个值改成 503

demo code:

package main

import (
	"fmt"
	"golang.org/x/sys/windows"
	"unicode/utf16"
)

var fileShareValidFlags uint32 = 0x00000007

func main() {
	var originalMode uint32

	handle, _ := windows.CreateFile(
		&(utf16.Encode([]rune("CONIN$\x00"))[0]), windows.GENERIC_READ|windows.GENERIC_WRITE,
		fileShareValidFlags, nil, windows.OPEN_EXISTING, windows.FILE_FLAG_OVERLAPPED, 0)

	_ = windows.GetConsoleMode(handle, &originalMode)

    // 503
	fmt.Println(originalMode)

	// problematic mode
	//windows.SetConsoleMode(handle, 992)
}

link:

  1. https://docs.microsoft.com/zh-cn/windows/console/setconsolemode
  2. 程序里面读取到的值992: https://github.com/muesli/cancelreader/blob/main/cancelreader_windows.go#L192
  3. reset为903: https://github.com/muesli/cancelreader/blob/main/cancelreader_windows.go#L222

fzdwx avatar Aug 17 '22 13:08 fzdwx

@shiluanzzz 你拉下最新的代码,在试试

fzdwx avatar Aug 17 '22 13:08 fzdwx

good job

shiluanzzz avatar Aug 18 '22 02:08 shiluanzzz