我有一个带有ocx控件的vb6表单。 ocx控件上有一个我想从代码中按下的按钮。 我该怎么做呢?
我有:
1 2 3
| Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd |
但它似乎不起作用。
我相信以下方法会起作用:
1 2 3
| Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True |
CommandButton实际上具有两个功能。一个是通常的单击按钮,另一个是切换按钮,其作用类似于CheckBox。 CommandButton的默认属性实际上是Value属性,该属性指示是否切换按钮。通过设置该属性,将生成Click事件。即使按钮未设置为ToggleButton样式,因此也不会更改其状态,否则仍会执行此操作。
如果您有权访问OCX代码,则可以公开关联的事件处理程序并直接调用它。
不知道在VB6天内是否存在等效的.Net Button的Click()方法
对于按键,您还可以使用sendmessage发送按键关闭和按键输入:
1 2 3 4 5 6 7 8 9 10 11
| 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 |
这个:
1 2 3
| Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True |
确实有效。完全不直观。我希望它会引发错误,因为布尔不是有效的CommandButton,但这是由于默认属性所致。
WM_LBUTTONDOWN将是鼠标单击,我想要的是按钮单击(按钮在hwnd按钮中,而不是鼠标按钮)。
我无权访问ocx的源代码(这是第三方控件)。如果这样做了,我将公开我想调用的函数(ocx的原始编写者应该公开了它)。
您可以访问OCX代码吗?您实际上不应该直接调用按钮的单击。您应该重构代码,以便OCX按钮单击代码调用一个函数,例如
1 2 3 4
| CMyWindow::OnLButtonDown()
{
this->FooBar();
} |
然后从您的VB6应用程序直接调用FooBar方法。如果您不能直接从VB6调用函数,则可以使用Windows消息proc函数包装FooBar()方法,例如
1
| #define WM_FOOBAR WM_APP + 1 |
然后在VB6中使用SendMessage,例如SendMessage(WM_FOOBAR, ...)