2

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

我有:

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

但它似乎不起作用。

4

5 回答 5

2

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

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

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

于 2008-09-03T12:08:30.553 回答
1

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

于 2008-09-03T03:15:52.533 回答
0

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

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

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

#define WM_FOOBAR WM_APP + 1

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

于 2008-09-03T12:20:24.703 回答
0

这:

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

确实有效。完全不直观。我希望它会引发错误,因为 bool 不是有效的命令按钮,但这是因为默认属性。

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

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

于 2008-09-03T23:12:09.007 回答
0

对于 keypress,您还可以使用 sendmessage 发送 keydown 和 keyup:

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
于 2008-10-01T05:24:16.460 回答