Frage

Ich habe ein VB6-Formular mit einem OCX-Steuerelement.Auf dem OCX-Steuerelement befindet sich eine Schaltfläche, die ich im Code drücken möchte.Wie mache ich das?

Ich habe:

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

aber es scheint nicht zu funktionieren.

War es hilfreich?

Lösung

Ich glaube, dass Folgendes funktionieren wird:

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

CommandButtons haben tatsächlich zwei Funktionen.Eine davon ist die übliche Klickschaltfläche und die andere ist eine Umschalttaste, die ähnlich wie a funktioniert CheckBox.Die Standardeigenschaft von CommandButton ist eigentlich das Value Eigenschaft, die angibt, ob eine Schaltfläche umgeschaltet ist.Durch Festlegen der Eigenschaft wird die Click Ereignis wird generiert.Dies geschieht auch dann, wenn die Schaltfläche nicht als formatiert ist ToggleButton und ändert daher seinen Zustand nicht.

Andere Tipps

Wenn Sie Zugriff auf den OCX-Code haben, können Sie den zugehörigen Event-Handler verfügbar machen und ihn direkt aufrufen.
Ich weiß nicht, ob es zu VB6-Tagen ein Äquivalent der Click()-Methode von .Net Button gab

Für den Tastendruck können Sie auch sendmessage verwenden, um sowohl Keydown als auch Keyup zu senden:

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

Das:

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

funktioniert.Völlig unintuitiv.Ich würde erwarten, dass es einen Fehler auslöst, da ein Bool-Wert kein gültiger CommandButton ist, aber das liegt an der Standardeigenschaft.

WM_LBUTTONDOWN Wäre ein Mausklick, was ich möchte, ist ein Tastenklick (Taste wie bei einer Hwnd-Taste, keine Maustaste).

Ich habe keinen Zugriff auf die Quelle des OCX (es ist eine Steuerung eines Drittanbieters).Wenn ich das täte, würde ich die Funktion offenlegen, die ich aufrufen wollte (der ursprüngliche Autor des OCX hätte sie offenlegen sollen).

Haben Sie Zugriff auf den OCX-Code?Sie sollten eigentlich nicht direkt einen Klick auf eine Schaltfläche aufrufen.Sie sollten den Code so umgestalten, dass der OCX-Schaltflächenklickcode eine Funktion aufruft, z. B.

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

Rufen Sie dann in Ihrer VB6-App direkt die FooBar-Methode auf.Wenn Sie Funktionen nicht direkt aus VB6 aufrufen können, können Sie die FooBar()-Methode mit einer Windows-Message-Proc-Funktion umschließen, z. B.

#define WM_FOOBAR WM_APP + 1

Dann benutze SendMessage im VB6, so SendMessage(WM_FOOBAR, ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top