如何单击vb6窗体上的按钮?

如何单击vb6窗体上的按钮?,vb6,Vb6,我有一个vb6窗体,上面有一个ocx控件。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 Butto

我有一个vb6窗体,上面有一个ocx控件。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
s实际上有两个功能。一个是常用的单击按钮,另一个是类似于
复选框的切换按钮。
CommandButton
的默认属性实际上是指示按钮是否切换的
属性。通过设置属性,将生成
单击
事件。即使按钮未设置为
切换按钮的样式,因此不会更改其状态,也会执行此操作。

您有权访问OCX代码吗?你不应该直接点击按钮。您应该重构代码,以便OCX按钮单击代码调用函数,例如

CMyWindow::OnLButtonDown()
{
  this->FooBar();
}
#define WM_FOOBAR WM_APP + 1
然后从VB6应用程序中,直接调用FooBar方法。如果无法直接从VB6调用函数,可以使用windows message proc函数包装FooBar()方法,例如

CMyWindow::OnLButtonDown()
{
  this->FooBar();
}
#define WM_FOOBAR WM_APP + 1
然后在VB6中使用
SendMessage
,如
SendMessage(WM_FOOBAR,…)

这样:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
确实有效。完全不直观。我希望它会抛出一个错误,因为bool不是有效的CommandButton,但这是因为默认属性

WM_LBUTTONDOWN
将是一个鼠标点击,我想要的是一个按钮点击(与hwnd按钮一样的按钮,而不是鼠标按钮)


我没有访问ocx源的权限(它是第三方控件)。如果我这样做了,我会公开我想要调用的函数(ocx的原始编写器应该公开它)。

对于按键,您还可以使用sendmessage发送keydown和keydup:

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