题
我有一个带有 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
CommandButton
s 实际上有两个功能。一个是通常的点击按钮,另一个是切换按钮,其作用类似于 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, ...)