SendMessage ocx.hwnd, WM_COMMAN"/>

如何单击vb6表单上的按钮?

如何单击vb6表单上的按钮?

How do I click a button on a vb6 form?

我有一个带有ocx控件的vb6表单。 ocx控件上有一个我想从代码中按下的按钮。 我该怎么做呢?

我有:

1
2
3
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd

但它似乎不起作用。


我相信以下方法会起作用:

1
2
3
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True

CommandButton实际上具有两个功能。一个是通常的单击按钮,另一个是切换按钮,其作用类似于CheckBoxCommandButton的默认属性实际上是Value属性,该属性指示是否切换按钮。通过设置该属性,将生成Click事件。即使按钮未设置为ToggleButton样式,因此也不会更改其状态,否则仍会执行此操作。


如果您有权访问OCX代码,则可以公开关联的事件处理程序并直接调用它。
不知道在VB6天内是否存在等效的.Net Button的Click()方法


对于按键,您还可以使用sendmessage发送按键关闭和按键输入:

1
2
3
4
5
6
7
8
9
10
11
Private Declare Function SendMessage Lib"user32" Alias"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Const WM_KEYDOWN As Integer = &H100
Const WM_KEYUP As Integer = &H101
Const VK_SPACE = &H20

Private Sub cmdCommand1_Click()
    Dim b As CommandButton
    Set b = ocx.GetButton("btnPrint")
    SendMessage b.hWnd, WM_KEYDOWN, VK_SPACE, 0&
    SendMessage b.hWnd, WM_KEYUP, VK_SPACE, 0&
End Sub

这个:

1
2
3
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True

确实有效。完全不直观。我希望它会引发错误,因为布尔不是有效的CommandButton,但这是由于默认属性所致。

WM_LBUTTONDOWN将是鼠标单击,我想要的是按钮单击(按钮在hwnd按钮中,而不是鼠标按钮)。

我无权访问ocx的源代码(这是第三方控件)。如果这样做了,我将公开我想调用的函数(ocx的原始编写者应该公开了它)。


您可以访问OCX代码吗?您实际上不应该直接调用按钮的单击。您应该重构代码,以便OCX按钮单击代码调用一个函数,例如

1
2
3
4
CMyWindow::OnLButtonDown()
{
  this->FooBar();
}

然后从您的VB6应用程序直接调用FooBar方法。如果您不能直接从VB6调用函数,则可以使用Windows消息proc函数包装FooBar()方法,例如

1
#define WM_FOOBAR WM_APP + 1

然后在VB6中使用SendMessage,例如SendMessage(WM_FOOBAR, ...)


推荐阅读