Вопрос

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

У меня есть:

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

Другие советы

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

Для нажатия клавиш вы также можете использовать 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

Это:

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

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

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

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

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

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

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

#define WM_FOOBAR WM_APP + 1

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top