如何在vb控制台模式下检测按键?

时间:2014-02-19 21:52:26

标签: vb.net console key

我想在开始时制作一个涉及菜单的程序,但不是使用典型的选择案例,而是希望以不同方式进行。

我希望它为用户提供一些选项,然后他们会使用箭头键在选项旁边移动一个小箭头。

最后按Enter键,然后您将前进到您选择的下一个屏幕。我一直在网上搜索,但我只能在表单模式中找到这种东西,而不是控制台。如果这不可能,请告诉我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

一种简单的方法是使用菜单类打印菜单并突出显示传递给它的项目编号:

Class Menu
    Private MenuList As New List(Of String)
    Public ReadOnly Property LineCount As Integer
        Get
            Return MenuList.Count
        End Get
    End Property
    Public Sub CreateNewMenu(strings As IEnumerable(Of String))
        MenuList.Clear()
        For Each s In strings
            MenuList.Add(s)
        Next
    End Sub
    Public Sub PrintMenu(highlight As Integer)
        If highlight < 0 OrElse highlight > MenuList.Count - 1 Then
            Throw New Exception("Invalid menu index")
        End If
        For I = 0 To MenuList.Count - 1
            If I = highlight Then
                SwapColors()
                Console.WriteLine(MenuList(I))
                Console.ResetColor()
            Else
                Console.WriteLine(MenuList(I))
            End If
        Next
    End Sub
    Private Sub SwapColors()
        Dim temp = Console.BackgroundColor
        Console.BackgroundColor = Console.ForegroundColor
        Console.ForegroundColor = temp
    End Sub
End Class

使用它看起来像这样:

Dim MainMenu As New Menu
MainMenu.CreateNewMenu(
    {
        "Option A",
        "Option B",
        "Option C"
    })
Dim CurrentItem As Integer = 0
Dim CurrentKey As ConsoleKey
While CurrentKey <> ConsoleKey.Enter
    Console.Clear()
    MainMenu.PrintMenu(CurrentItem)
    CurrentKey = Console.ReadKey(True).Key
    If CurrentKey = ConsoleKey.UpArrow Then
        CurrentItem -= 1
    ElseIf CurrentKey = ConsoleKey.DownArrow Then
        CurrentItem += 1
    End If
    CurrentItem = (CurrentItem + MainMenu.LineCount) Mod MainMenu.LineCount
End While

这将使用反色突出显示所选项目,但如果需要,可以在将项目写入控制台时轻松更改以添加指示符。

当while循环退出CurrentItem时,将保留所选菜单项的从0开始的索引。

这种方法的一个优点是您可以拥有多个菜单集合,这些菜单允许您根据选择显示特定的菜单。