我有一个带有 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 表单。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
生成事件。即使按钮的样式未设置为 aToggleButton
并且因此不会更改其状态,也会这样做。
如果您有权访问 OCX 代码,则可以公开关联的事件处理程序并直接调用它。
不知道 .Net Button 的 Click() 方法在 VB6 时代是否存在
您可以访问 OCX 代码吗?你不应该真的直接调用一个按钮的点击。您应该重构代码,以便 OCX 按钮单击代码调用一个函数,例如
CMyWindow::OnLButtonDown()
{
this->FooBar();
}
然后从您的 VB6 应用程序中,直接调用 FooBar 方法。如果您不能直接从 VB6 调用函数,您可以使用 windows 消息 proc 函数包装 FooBar() 方法,例如
#define WM_FOOBAR WM_APP + 1
然后SendMessage
在VB6中使用,比如SendMessage(WM_FOOBAR, ...)
这:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
确实有效。完全不直观。我希望它会引发错误,因为 bool 不是有效的命令按钮,但这是因为默认属性。
WM_LBUTTONDOWN
将是鼠标单击,我想要的是按钮单击(按钮如 hwnd 按钮,而不是鼠标按钮)。
我无权访问 ocx 的来源(它是第 3 方控件)。如果我这样做了,我会公开我想调用的函数(ocx 的原始作者应该公开它)。
对于 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