Come faccio a fare clic su un pulsante su un modulo vb6?
-
09-06-2019 - |
Domanda
Ho un modulo vb6 con un controllo ocx su di esso.Il controllo ocx ha un pulsante che voglio premere dal codice.Come faccio a fare questo?
Io ho:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd
ma non sembra funzionare.
Soluzione
Credo che quanto segue funzionerà:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
CommandButton
In realtà hanno due funzioni.Uno è il solito pulsante di clic e l'altro è un pulsante di attivazione/disattivazione che funziona in modo simile a un CheckBox
.La proprietà predefinita di CommandButton
è in realtà il Value
proprietà che indica se un pulsante è attivato/disattivato.Impostando la proprietà, il Click
viene generato l'evento.Ciò avviene anche se il pulsante non ha lo stile a ToggleButton
e quindi non cambia il suo stato.
Altri suggerimenti
Se hai accesso al codice OCX, potresti esporre il gestore eventi associato e invocarlo direttamente.
Non so se un equivalente del metodo Click() di .Net Button esistesse ai tempi di VB6
Per la pressione dei tasti puoi anche utilizzare sendmessage inviando sia keydown che 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
Questo:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
funziona.Completamente non intuitivo.Mi aspetto che generi un errore poiché un bool non è un CommandButton valido, ma è a causa della proprietà predefinita.
WM_LBUTTONDOWN
sarebbe un clic del mouse, quello che voglio è un clic sul pulsante (pulsante come in un pulsante hwnd, non un pulsante del mouse).
Non ho accesso al sorgente dell'ocx (è un controllo di terze parti).Se lo facessi, esporrei la funzione che volevo chiamare (lo scrittore originale dell'ocx avrebbe dovuto esporla).
Hai accesso al codice OCX?Non dovresti davvero invocare direttamente il clic di un pulsante.Dovresti rifattorizzare il codice in modo che il codice di clic del pulsante OCX richiami una funzione, ad es.
CMyWindow::OnLButtonDown()
{
this->FooBar();
}
Quindi dalla tua app VB6, chiama direttamente il metodo FooBar.Se non puoi chiamare direttamente le funzioni da VB6 puoi racchiudere il metodo FooBar() con una funzione di proc dei messaggi di Windows, ad es.
#define WM_FOOBAR WM_APP + 1
Quindi utilizzare SendMessage
nel VB6, come SendMessage(WM_FOOBAR, ...)