VB.net: 如何在本机控件上引发鼠标单击/键盘事件

VB.net: How to raise mouse-click / keyboard events on native controls

背景
我想在我的项目中自动测试 Windows 表单 类。我想进行类似“如果单击按钮 F5,是否执行了 xyz 功能?”这样的测试。

为此,我需要触发鼠标单击或键盘事件。

环境

问题
如何触发控件上的鼠标单击或键盘事件?

+α:如何在任意控件上触发任意事件?

具体例子
我的生产形式有一个 GridDataView。在我的测试中,我 运行 view.Row (0).selected = True 到 select 第一行。现在我想触发一个双击事件和一个 Keys.Enter 按键事件来模拟这些用户交互。

到目前为止我尝试了什么

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的通知:

  • 好:如果 FormKeyPreview 设置为 False,从外部调用 OnKeyDown() 将不会触发任何内容。这与实际关键事件一致,因此很好。
  • 不好:不会转发关键事件。
    考虑一个 Form 和一个 Button 有一个 KeyDown 事件。如果用户按下实际 GUI 上的一个键,事件将同时到达 controls/widgets。但是,使用此处描述的方法,事件只会在对象被调用时触发