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