我有一個vb6的形式與它的ocx控件。 ocx控件上有一個我想從代碼中按下的按鈕。我該怎麼做呢?如何點擊vb6表單上的按鈕?
我:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd
,但它似乎並沒有工作。
我有一個vb6的形式與它的ocx控件。 ocx控件上有一個我想從代碼中按下的按鈕。我該怎麼做呢?如何點擊vb6表單上的按鈕?
我:
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
5事實上具有雙重功能。一個是通常的點擊按鈕,另一個是切換按鈕,其作用類似於CheckBox
。 CommandButton
的默認屬性實際上是指示是否切換按鈕的Value
屬性。通過設置屬性,將生成Click
事件。即使該按鈕未被設置爲ToggleButton
並因此不會更改其狀態,也會執行此操作。
如果您有權訪問OCX代碼,則可以公開相關的事件處理程序並直接調用它。
不知道的.Net按鈕的Click()方法的等效在VB6天要追溯到
您有權訪問OCX代碼嗎?你不應該直接調用按鈕的點擊。您應該重構代碼,以便OCX按鈕點擊代碼調用一個函數,例如
CMyWindow::OnLButtonDown()
{
this->FooBar();
}
然後從您的VB6應用程序直接調用FooBar方法。如果你不能直接從VB6調用函數,你可以用FooBar()方法來包裝一個windows消息處理函數,例如
#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的源(這是第三方控件)。如果我這樣做,我會暴露我想調用的函數(ocx的原作者應該已經暴露了它)。
對於按鍵,您還可以使用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