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