2008-09-03 50 views
2

我有一個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 

,但它似乎並沒有工作。

回答

3

我相信下面的工作:

Dim b As CommandButton 
Set b = ocx.GetButton("btnPrint") 
b = True 

CommandButton 5事實上具有雙重功能。一個是通常的點擊按鈕,另一個是切換按鈕,其作用類似於CheckBoxCommandButton的默認屬性實際上是指示是否切換按鈕的Value屬性。通過設置屬性,將生成Click事件。即使該按鈕未被設置爲ToggleButton並因此不會更改其狀態,也會執行此操作。

1

如果您有權訪問OCX代碼,則可以公開相關的事件處理程序並直接調用它。
不知道的.Net按鈕的Click()方法的等效在VB6天要追溯到

0

您有權訪問OCX代碼嗎?你不應該直接調用按鈕的點擊。您應該重構代碼,以便OCX按鈕點擊代碼調用一個函數,例如

CMyWindow::OnLButtonDown() 
{ 
    this->FooBar(); 
} 

然後從您的VB6應用程序直接調用FooBar方法。如果你不能直接從VB6調用函數,你可以用FooBar()方法來包裝一個windows消息處理函數,例如

#define WM_FOOBAR WM_APP + 1 

然後在VB6使用SendMessage,像SendMessage(WM_FOOBAR, ...)

0

此:

Dim b As CommandButton 
Set b = ocx.GetButton("btnPrint") 
b = True 

確實工作。完全不直觀。我期望它會拋出一個錯誤,因爲布爾不是一個有效的CommandButton,但它是由於默認屬性的東西。

WM_LBUTTONDOWN將是一個鼠標點擊,我想要的是一個按鈕單擊(按鈕,如在hwnd按鈕,而不是鼠標按鈕)。

我無權訪問ocx的源(這是第三方控件)。如果我這樣做,我會暴露我想調用的函數(ocx的原作者應該已經暴露了它)。

0

對於按鍵,您還可以使用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