Как мне нажать кнопку в форме vb6? - PullRequest
2 голосов
/ 03 сентября 2008

У меня есть форма vb6 с элементом управления ocx. У элемента управления ocx есть кнопка, которую я хочу нажать из кода. Как мне это сделать?

У меня есть:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd

но, похоже, не работает.

Ответы [ 5 ]

2 голосов
/ 03 сентября 2008

Я считаю, что будет работать следующее:

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

CommandButton s на самом деле имеют две функции. Одна - обычная кнопка щелчка, а другая - кнопка переключения, которая действует подобно CheckBox. Свойство по умолчанию CommandButton на самом деле является свойством Value, которое указывает, переключается ли кнопка. При установке свойства генерируется событие Click. Это делается, даже если кнопка не оформлена как ToggleButton и поэтому не меняет своего состояния.

1 голос
/ 03 сентября 2008

Если у вас есть доступ к коду OCX, вы можете открыть связанный обработчик событий и вызвать его напрямую.
Не знаю, существовал ли эквивалент метода Click () кнопки .Net в VB6 дней

0 голосов
/ 01 октября 2008

Для нажатия клавиш вы также можете использовать 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
0 голосов
/ 04 сентября 2008

Это:

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

работает. Совершенно не интуитивно понятно. Я ожидаю, что он выдаст ошибку, так как bool не является допустимым CommandButton, но это из-за свойства по умолчанию.

WM_LBUTTONDOWN будет щелчком мыши, то, что я хочу, это нажатие кнопки (кнопка, как у кнопки hwnd, а не кнопка мыши).

У меня нет доступа к источнику ocx (это сторонний элемент управления). Если бы я это сделал, я бы выставил функцию, которую я хотел вызвать (оригинальный автор ocx должен был разоблачить ее).

0 голосов
/ 03 сентября 2008

У вас есть доступ к коду OCX? Вы не должны прямо вызывать нажатие кнопки. Вы должны изменить код так, чтобы код щелчка кнопкой OCX вызывал функцию, например,

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

Затем из вашего приложения VB6 напрямую вызовите метод FooBar. Если вы не можете напрямую вызывать функции из VB6, вы можете заключить метод FooBar () в функцию обработки сообщений Windows, например,

#define WM_FOOBAR WM_APP + 1

Затем используйте SendMessage в VB6, как SendMessage(WM_FOOBAR, ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...