Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环VB.NET WinForms中等待按键_Vb.net_Winforms_Keypress - Fatal编程技术网

在循环VB.NET WinForms中等待按键

在循环VB.NET WinForms中等待按键,vb.net,winforms,keypress,Vb.net,Winforms,Keypress,我正在制作一个winforms应用程序,其目的是使用组合键将符号写入文本框。用户在关注RichTextBox时按键。某些组合键,如Ctrl+S,只需生成一个字符并等待下一次按键,如ʃ。当您在按住Ctrl键的同时重复按同一个键时,其他组合键将生成不同的字符。例如,如果我按Ctrl键,则会键入一个,æ,但如果我在按住Ctrl键的同时再次按A键,æ将被删除,而æ将出现。它将继续在这两个键之间循环,直到播放器释放Ctrl键或按下另一个键 不过,我一直在尝试实现这种行为。这是我到目前为止得到的一个粗略的想

我正在制作一个winforms应用程序,其目的是使用组合键将符号写入文本框。用户在关注RichTextBox时按键。某些组合键,如Ctrl+S,只需生成一个字符并等待下一次按键,如
ʃ
。当您在按住Ctrl键的同时重复按同一个键时,其他组合键将生成不同的字符。例如,如果我按Ctrl键,则会键入一个,
æ
,但如果我在按住Ctrl键的同时再次按A键,
æ
将被删除,而
æ
将出现。它将继续在这两个键之间循环,直到播放器释放Ctrl键或按下另一个键

不过,我一直在尝试实现这种行为。这是我到目前为止得到的一个粗略的想法;主要的绊脚石是,我不知道如何暂停在中间的循环,并阅读一个按键,使用形式:

Private Sub IPAtext_KeyPress(sender As Object, e As KeyEventArgs) Handles IPAtext.KeyDown
    Dim AChars() As Char = {"æ", "ɑ"}
    Dim Counter As Integer = 0
    Select Case e.Modifiers
        Case Keys.Control
            Select Case e.KeyCode
                Case Keys.A
                    While e.Modifiers = Keys.Control And e.KeyCode = Keys.A
                        IPAtext.AppendText(AChars(Counter))
                        '-- Pause for keypress. If keypress =/= A then complete loop, if keypress is A again then increase counter. --
                        Counter = (Counter + 1) Mod AChars.Count 'Increments the counter so that it cycles back to 0 when it goes past the count of AChars.
                        '-- Only execute the line below if keypress is A. --
                        IPAtext.Text = IPAtext.Text.Remove(IPAtext.TextLength - 1) 'Remove the last character from the textbox.
                    End While
            End Select
    End Select
End Sub

我还应该注意到,我试图在一定程度上模拟的行为。

这是我在尝试时想到的。在KeyDown事件上设置一个处理程序,然后在默认情况下取消所有按键。然后看看是否可以将当前的键码与您期望的特殊情况相匹配。否则,按KeyEventArgs对象并离开子对象

我的代码将选择您希望循环的文本,因此您可以手动选择一个字符并“继续”循环,即使Ctrl被释放。你必须根据自己的喜好修改,但这至少是你的一个开始

   Private Sub RichTextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyDown
    e.SuppressKeyPress = True
    e.Handled = True

    Select Case e.KeyCode
        Case Keys.A And e.Modifiers = Keys.Control
            RichTextBox1.SelectedText = GetCharacterToPrint(RichTextBox1.SelectedText, New Char() {"æ", "ɑ"})
            RichTextBox1.Select(RichTextBox1.SelectionStart - 1, 1)
        Case Else
            e.Handled = False
            e.SuppressKeyPress = False
    End Select
End Sub
下面是一个用于返回下一个字符的简短函数:

Private Function GetCharacterToPrint(ByVal SelectedText As String, ByVal Characters As Char()) As Char
    If SelectedText.Length <> 1 Then
        Return Characters(0)
    End If
    Dim c As Char = SelectedText(0)
    Dim index As Integer = String.Join("", Characters).IndexOf(c)
    If index = Characters.Length - 1 Then
        Return Characters(0)
    Else
        Return Characters(index + 1)
    End If
End Function

你有更大的问题,Ctrl+A已经在RichTextBox中执行了一些操作,它会选择所有文本。显然不是你想要的,也不容易修复。你不能“中间停顿”,你需要使用一个变量。当我谈到这一点时,我本打算考虑一下,但也许我应该向前想一想。不管怎样,什么类型的变量?我知道Console中有ConsoleKeyInfo和ConsoleKey,但我不知道如何轻松地处理表单。我可以使用什么函数读取按键并将其插入该变量?您可能必须使用ProcessCmdKey我感谢您的努力,但这还不足以解决问题。它仅在选择已写入的文本时有效,当我希望Ctrl+A生成文本,然后在用户再次按下Ctrl+A时更改文本时有效-此外,它需要在该组合键的所有可能变体之间循环,直到用户释放Ctrl或按下另一个键。我仍然不明白我该怎么做。如果没有选择任何内容,或者如果选择的文本不是“æ”,它将打印“æ”,如果选择了“æ”,它将打印“Æ”。SelectedText只是CaretPosition。或者您是否正在使用.NET4.5编写代码?这是在4.0中完成的。我在VS2012 Express上,使用.NET 4.5.50938(非常具体)。那会有什么不同吗?我想是的,因为它对你来说不像对我那样有效。遗憾的是,我没有4.5版本可用,所以其他人必须修改它以在4.5版本中工作。我会在这段时间看看自行车赛。恐怕我只能为你做这些了。希望你能成功。
Private Sub RichTextBox1_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyUp
    If e.KeyValue = Keys.ControlKey Then
        RichTextBox1.SelectionStart += 1
    End If
End Sub