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

我有:

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

但它似乎不起作用。

有帮助吗?

解决方案

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

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

CommandButtons 实际上有两个功能。一个是通常的点击按钮,另一个是切换按钮,其作用类似于 CheckBox. 。的默认属性 CommandButton 实际上是 Value 指示按钮是否切换的属性。通过设置属性, Click 事件已生成。即使按钮的样式不是 ToggleButton 因此不会改变其状态。

其他提示

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

对于按键,您还可以使用 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

这:

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

确实有效。完全不直观。我希望它会抛出错误,因为 bool 不是有效的 CommandButton,但这是因为默认属性。

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

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

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

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

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

#define WM_FOOBAR WM_APP + 1

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top