Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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 是否有方法覆盖击键发送到哪个控件?_Vb.net_Controls_Keystroke - Fatal编程技术网

Vb.net 是否有方法覆盖击键发送到哪个控件?

Vb.net 是否有方法覆盖击键发送到哪个控件?,vb.net,controls,keystroke,Vb.net,Controls,Keystroke,对于我的聊天应用程序的服务器版本,我有两个控件:一个输入文本框,用于输入聊天信息;一个客户端列表选中列表框,我可以在其中选择连接的客户端,以便对它们执行各种操作(如静音、踢腿等) 以下是与这些控件关联的事件的处理程序: Private Sub Input_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Input.KeyDown If e.KeyCode = Ke

对于我的聊天应用程序的服务器版本,我有两个控件:一个
输入
文本框
,用于输入聊天信息;一个
客户端列表
选中列表框
,我可以在其中选择连接的客户端,以便对它们执行各种操作(如静音、踢腿等)

以下是与这些控件关联的事件的
处理程序

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
Private Sub Input_KeyDown(ByVal sender作为对象,ByVal e作为System.Windows.Forms.KeyEventArgs)处理Input.KeyDown
如果e.KeyCode=Keys.Escape,则
e、 SuppressKeyPress=True
如果结束
如果e.KeyCode=Keys,则输入
Send.PerformClick()
e、 SuppressKeyPress=True
如果结束
端接头
Private Sub ClientList_KeyPress(ByVal sender作为对象,ByVal e作为System.Windows.Forms.KeyPressEventArgs)处理ClientList.KeyPress
如果e.KeyChar“”则
输入。选择()
SendKeys.Send(例如KeyChar)
如果结束
端接头
(请注意,
Send
是一个将输入发送到聊天室的按钮)

虽然
ClientList
具有焦点:正如您在
ClientList\u KeyPress
中看到的,我希望将与
ClientList
无关的任何
按键发送到
Input
。(在
ClientList
中导航和选择项目只需要空格键和箭头键)

尽管上面的代码按预期工作,但我觉得这是一种不雅观的方式。使用
SendKeys
不会委派
KeyPress
——它只会向应用程序发送另一次击键,感觉编码很差。如果代码稍微更改,使其更复杂且运行异步,则如果
输入,则可能会发送无休止的击键。无论出于何种原因,Select
失败,或者
客户端列表
再次被关注

因此,我想要一个在
击键发送到焦点控件之前截取它的建议,或者一个在
ClientList\u KeyPress
中触发
Input.KeyPress
事件的建议(即委派)


我没有从自己的研究中找到任何东西-我只能找到上面使用
SendKeys
的代码。

像Escape和Enter这样的键应该在它们到达带有焦点的控件之前被拦截。使用表单的AcceptButton和CancelButton属性或重写ProcessCmdKey()。常规的击键应该在有焦点的控件中清晰可见,而不是重定向,并且很容易用Backspace和Delete等键进行更正。通常是一个文本框。确保用户可以使用Tab键轻松聚焦。@HansPassant我的表单上有多个按钮,包括聊天的
Send
,根据哪个文本框有聚焦,Enter可以激活这些按钮,因此我认为我无法实现这一点。我不明白你说的其他事情与我的问题有什么关系……不可能理解为什么,将表单的AcceptButton属性设置为Send按钮已经足够了。如果需要自定义方案(不要混淆用户),请重写ProcessCmdKey并使用ActiveControl属性。请其他人操作您的UI,这是获得建设性反馈的最佳方式。@HansPassant OK-我从未重写/使用过ProcessCmdKey,因此我将对此进行研究,因为这听起来是处理Enter/Esc的更好方式。但是,当
ClientList
处于焦点时,向另一个控件发送击键又如何呢?