VB.net: 如何在本机控件上引发鼠标单击/键盘事件
VB.net: How to raise mouse-click / keyboard events on native controls
背景
我想在我的项目中自动测试 Windows 表单 类。我想进行类似“如果单击按钮 F5
,是否执行了 xyz 功能?”这样的测试。
为此,我需要触发鼠标单击或键盘事件。
环境
- 桂:Windows表格
- 测试框架:MSTests
- 测试方式:我不测试独立的exe文件
问题
如何触发控件上的鼠标单击或键盘事件?
+α:如何在任意控件上触发任意事件?
具体例子
我的生产形式有一个 GridDataView
。在我的测试中,我 运行 view.Row (0).selected = True
到 select 第一行。现在我想触发一个双击事件和一个 Keys.Enter
按键事件来模拟这些用户交互。
到目前为止我尝试了什么
view.PerformDoubleClick()
view.DoubleClick (Nothing,Nothing)
view.OnDoubleClick (Nothing)
RaiseEvent DoubleClick (Nothing,Nothing)
RaiseEvent view.DoubleClick (Nothing,Nothing)
None 这些方法有效;有些甚至不编译
This Microsoft article 表示可能无法完成我正在尝试的事情
An event can be raised only from the declaration space in which it is declared. Therefore, a class cannot raise events from any other class, even one from which it is derived.
能直接调用控件的OnClick()函数吗?对你的测试是否足够?
我记得模拟事件是不可能的,尽管可以从外部调用函数。我也遇到过这种情况。
我找到的唯一解决方案是对每个要操作的 control(小部件)进行子类化,并使它们的 On*()
方法成为 public
。
下面的代码继承了 Button
以允许从外部使用 OnClick()
和 OnKeyDown()
方法。
Imports System.Windows.Forms
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Public Class MyButton
Inherits Button
Public Shadows Sub OnClick (e As System.EventArgs)
MyBase.OnClick (e)
End Sub
Public Shadows Sub OnKeyDown (kevent As KeyEventArgs)
MyBase.OnKeyDown (kevent)
End Sub
End Class
关于KeyDown
的通知:
- 好:如果
Form
的 KeyPreview
设置为 False
,从外部调用 OnKeyDown()
将不会触发任何内容。这与实际关键事件一致,因此很好。
- 不好:不会转发关键事件。
考虑一个 Form
和一个 Button
有一个 KeyDown
事件。如果用户按下实际 GUI 上的一个键,事件将同时到达 controls/widgets。但是,使用此处描述的方法,事件只会在对象被调用时触发
背景
我想在我的项目中自动测试 Windows 表单 类。我想进行类似“如果单击按钮 F5
,是否执行了 xyz 功能?”这样的测试。
为此,我需要触发鼠标单击或键盘事件。
环境
- 桂:Windows表格
- 测试框架:MSTests
- 测试方式:我不测试独立的exe文件
问题
如何触发控件上的鼠标单击或键盘事件?
+α:如何在任意控件上触发任意事件?
具体例子
我的生产形式有一个 GridDataView
。在我的测试中,我 运行 view.Row (0).selected = True
到 select 第一行。现在我想触发一个双击事件和一个 Keys.Enter
按键事件来模拟这些用户交互。
到目前为止我尝试了什么
view.PerformDoubleClick()
view.DoubleClick (Nothing,Nothing)
view.OnDoubleClick (Nothing)
RaiseEvent DoubleClick (Nothing,Nothing)
RaiseEvent view.DoubleClick (Nothing,Nothing)
None 这些方法有效;有些甚至不编译
This Microsoft article 表示可能无法完成我正在尝试的事情
An event can be raised only from the declaration space in which it is declared. Therefore, a class cannot raise events from any other class, even one from which it is derived.
能直接调用控件的OnClick()函数吗?对你的测试是否足够?
我记得模拟事件是不可能的,尽管可以从外部调用函数。我也遇到过这种情况。
我找到的唯一解决方案是对每个要操作的 control(小部件)进行子类化,并使它们的 On*()
方法成为 public
。
下面的代码继承了 Button
以允许从外部使用 OnClick()
和 OnKeyDown()
方法。
Imports System.Windows.Forms
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Public Class MyButton
Inherits Button
Public Shadows Sub OnClick (e As System.EventArgs)
MyBase.OnClick (e)
End Sub
Public Shadows Sub OnKeyDown (kevent As KeyEventArgs)
MyBase.OnKeyDown (kevent)
End Sub
End Class
关于KeyDown
的通知:
- 好:如果
Form
的KeyPreview
设置为False
,从外部调用OnKeyDown()
将不会触发任何内容。这与实际关键事件一致,因此很好。 - 不好:不会转发关键事件。
考虑一个Form
和一个Button
有一个KeyDown
事件。如果用户按下实际 GUI 上的一个键,事件将同时到达 controls/widgets。但是,使用此处描述的方法,事件只会在对象被调用时触发