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

时间:2020-03-05 18:46:52  来源:igfitidea点击:

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

我有:

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

但它似乎不起作用。

解决方案

回答

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

回答

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

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

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

回答

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

CMyWindow::OnLButtonDown()
{
  this->FooBar();
}

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

#define WM_FOOBAR WM_APP + 1

然后在VB6中使用SendMessage,就像SendMessage(WM_FOOBAR,...)

回答

这:

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

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

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

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

回答

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

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