Como faço para clicar em um botão em uma vb6 forma?
-
09-06-2019 - |
Pergunta
Eu tenho um vb6 formulário com um controle ocx sobre ele.O controle ocx tem um botão que eu quero prima de código.Como eu faço isso?
Eu tenho:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd
mas ele parece não funcionar.
Solução
Eu acredito o seguinte funcionará:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
CommandButton
s, na verdade, tem duas funções.Um deles é o de costume, clique em botão e o outro é um botão de alternância que funciona semelhante a um CheckBox
.A propriedade padrão do CommandButton
na verdade, é o Value
propriedade que indica se o botão é alternada.Definindo a propriedade, o Click
evento é gerado.Isso é feito mesmo se o botão não está desenhado como um ToggleButton
e, portanto, não altera seu estado.
Outras dicas
Se você tiver acesso a OCX código, você pode expor o associado manipulador de eventos e invocá-lo diretamente.
Não sei se um equivalente .Net Clique do Botão() método existia de volta em VB6 dias
Para keypress você também pode usar sendmessage o envio de keydown e 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
Este:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
não funciona.Completamente intuitivo.Eu esperaria para lançar um erro, pois um bool não é válido CommandButton, mas é porque a propriedade padrão coisa.
WM_LBUTTONDOWN
seria um clique do mouse, o que eu quero é o clique de um botão (botão em um hwnd botão, e não a um botão do rato).
Eu não tiver acesso à fonte da ocx (é a 3ª festa de controle).Se eu fiz, eu gostaria de expor a função que eu queria chamar (o escritor original da ocx deve ter exposta).
Você tem acesso a OCX código?Você realmente não deve ser diretamente invocando o clique de um botão.Você deve refatorar o código para que o OCX clique no botão de chamadas de código de uma função, por exemplo,
CMyWindow::OnLButtonDown()
{
this->FooBar();
}
Em seguida, a partir do seu aplicativo VB6, chamar diretamente o FooBar método.Se você não pode chamar diretamente funções de VB6 você pode quebrar o FooBar() método com uma mensagem do windows proc função, ex:
#define WM_FOOBAR WM_APP + 1
Em seguida, use SendMessage
no VB6, como SendMessage(WM_FOOBAR, ...)