对于我的聊天应用的服务器版本,我在表单中有两个控件:Input
TextBox
来输入聊天,ClientList
CheckedListBox
我可以选择已连接的客户端以对其执行各种操作(例如静音,踢等)。
以下是与这些控件相关联的事件的Handlers
:
Private Sub Input_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Input.KeyDown
If e.KeyCode = Keys.Escape Then
e.SuppressKeyPress = True
End If
If e.KeyCode = Keys.Enter Then
Send.PerformClick()
e.SuppressKeyPress = True
End If
End Sub
Private Sub ClientList_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ClientList.KeyPress
If e.KeyChar <> " " Then
Input.Select()
SendKeys.Send(e.KeyChar)
End If
End Sub
(请注意,Send
是一个将输入发送到聊天的按钮)
虽然ClientList
具有焦点:正如您在ClientList_KeyPress
中看到的那样,我希望将与KeyPresses
无关的任何ClientList
发送到Input
}。 (只需要空格键和箭头键来导航和选择ClientList
)
虽然上面的代码可以正常工作,但我觉得这样做是一种不太优雅的方式。使用SendKeys
不会委托KeyPress
- 它只是简单地向应用程序发送另一个击键,感觉编码很差。如果稍微改变代码以使其更复杂并且运行异步,那么如果Input.Select
因任何原因失败或ClientList
最终再次聚焦,则可能会发送无限的击键。< / p>
所以我想要一个建议,在KeyStroke
发送到焦点控件之前拦截Input.KeyPress
或在ClientList_KeyPress
触发SendKeys
事件的建议(即委托)。< / p>
我无法从自己的研究中找到任何内容 - 使用<a href="/shop/" class="name-link">Cargo Pant</a>
的上述代码是我能找到的。