VB MouseClick-Event bei PictureBox

Brian93

Well-known member
30 September 2006
378
21
Guten Abend,

ich habe zuletzt aus Spaß ein kleines Programm geschrieben, was per Webcam die Geschwindigkeit vorbeifahrender Autos misst. Es klappt schon sehr gut, allerdings habe ich ein kleines Problem mit der Markierung der zwei Messpunkte.

Das Live-Video wird in einer Picturebox angezeigt. Wenn ich das Programm starte und das Video noch ausgeschaltet ist, funktioniert folgender Code ohne Probleme, um Mausklicks innerhalb der Control aufzunehmen:

Code:
Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseClick, PictureBox2.MouseClick

Sobald ich jedoch auf "Start Video" drücke, welches den Videostream startet und einen Timer aktiviert, scheint die Picturebox auf meine Klicke nicht mehr zu reagieren!

Auszug aus dem Code für das Holen der Webcambilder:
Code:
Button 1 Klick:
....
videoHandle = Me.CreateCaptureWindow(PictureBox1.Handle)

            Timer1.Interval = 41
            Timer1.Enabled = True
            Me.SetVideoFormat(Me.PictureBox1.Size)

....


Timer 1 Tick:
..
SendMessage(videoHandle, WM_CAP_EDIT_COPY, 0, 0)
        PictureBox2.Image = Clipboard.GetImage
        Clipboard.Clear()
        ' Das Bild aus der Picturebox klonen
        Dim Bild As Bitmap = CType(Me.PictureBox2.Image.Clone, Bitmap)
..


 Function CreateCaptureWindow(ByRef hWndParent As IntPtr, Optional ByRef x As Short = 0, Optional ByRef y As Short = 0, Optional ByRef nCameraID As Integer = 0) As IntPtr
        'Dim previewHandle As IntPtr

        previewHandle = capCreateCaptureWindow("Video", WS_CHILD + WS_VISIBLE, x, y, nWidth, nHeight, PictureBox1.Handle, 0)
....
        Return previewHandle
    End Function

Habt ihr eine Idee, wie ich während der Live-Video Anzeige in der Picturebox trotzdem Mausklicks darauf registrieren kann, um meine beiden Messpunkte auszuwählen?

Dankeschön schon einmal und sorry für die komischen Code-Auszüge, ich bin kein Fan/Könner von vb.net :D.
 
Schon ne Weile her, wie ich VB und Capture von ner Kamera gemacht hab :biggrin:

In dem Moment, wo du die WinAPI aufrufst und ein Video in deine PictureBox baust, überlagert Windows die PictureBox mit einem weiteren Fenster, wo dann auch das Video drin is. Dieses Fenster kriegt die WM_CLICK-Messages und somit kriegt sie die PictureBox nicht mehr.

Das besagte Fenster legst du ja selber an. D.h. du hast auch das HWND und kannst somit die WindowProc für dieses Fenster setzen und somit die WM_CLICK-Messages wieder abfangen. Du musst hier halt Handarbeit machen, weil du mit deinem manuellen Fenstererzeugen natürlich nix vom VB-Komfort hast.
 
Schon ne Weile her, wie ich VB und Capture von ner Kamera gemacht hab :biggrin:

In dem Moment, wo du die WinAPI aufrufst und ein Video in deine PictureBox baust, überlagert Windows die PictureBox mit einem weiteren Fenster, wo dann auch das Video drin is. Dieses Fenster kriegt die WM_CLICK-Messages und somit kriegt sie die PictureBox nicht mehr.

Das besagte Fenster legst du ja selber an. D.h. du hast auch das HWND und kannst somit die WindowProc für dieses Fenster setzen und somit die WM_CLICK-Messages wieder abfangen. Du musst hier halt Handarbeit machen, weil du mit deinem manuellen Fenstererzeugen natürlich nix vom VB-Komfort hast.

Alles klar, dankeschön. Sowas in der Art habe ich mir schon gedacht. Ich wusste nur nicht so recht, wie ich herauskriege, was über die Picturebox rübergelegt wird.

Ich probiers mal mit dem HWND :).
 
Schon ne Weile her, wie ich VB und Capture von ner Kamera gemacht hab :biggrin:

In dem Moment, wo du die WinAPI aufrufst und ein Video in deine PictureBox baust, überlagert Windows die PictureBox mit einem weiteren Fenster, wo dann auch das Video drin is. Dieses Fenster kriegt die WM_CLICK-Messages und somit kriegt sie die PictureBox nicht mehr.

Das besagte Fenster legst du ja selber an. D.h. du hast auch das HWND und kannst somit die WindowProc für dieses Fenster setzen und somit die WM_CLICK-Messages wieder abfangen. Du musst hier halt Handarbeit machen, weil du mit deinem manuellen Fenstererzeugen natürlich nix vom VB-Komfort hast.

Perfekt, es klappt. Allerdings fehlt mir noch das Einbinden von videoHandle.


Mit dem Code hier mache ich es gerade:
Code:
Protected Overrides Sub WndProc(ByRef m As Message)
        If m.WParam.ToInt32 = 513 Then
              ...
        End If
        MyBase.WndProc(m)
End Sub

Da wird ja jetzt aber jeder einzelne Mausdown registriert.
Ich hab schon probiert irgendwie noch sowas einzubinden wie "And m.HWnd = videoHandle", das scheint aber nicht zu funktionieren.

Hast du da noch einen Tipp parat?
 
Zuletzt bearbeitet:
Da wird ja jetzt aber jeder einzelne Mausdown registriert.
Ich hab schon probiert irgendwie noch sowas einzubinden wie "And m.HWnd = videoHandle", das scheint aber nicht zu funktionieren.
Was funktioniert da nicht?
Ich würde da schon erwarten, dass du nur Nachrichten für dein Fenster kriegst (evtl. plus Child-Fenster - weiß ich ned sicher). Spätestens, wenn du dann das hWnd von der Message checkst, solltest du sicher wissen, ob die Nachricht für dich relevant is.

Is vielleicht die Konstante falsch?
Da gibts ja vieles... WM_CLICK, WM_MOUSEDOWN, WM_MOUSEUP, WM_DBLCLICK, ...
 
Was funktioniert da nicht?
Ich würde da schon erwarten, dass du nur Nachrichten für dein Fenster kriegst (evtl. plus Child-Fenster - weiß ich ned sicher). Spätestens, wenn du dann das hWnd von der Message checkst, solltest du sicher wissen, ob die Nachricht für dich relevant is.

Is vielleicht die Konstante falsch?
Da gibts ja vieles... WM_CLICK, WM_MOUSEDOWN, WM_MOUSEUP, WM_DBLCLICK, ...

Habe ich vielleicht falsch formuliert. Ich meine, dass damit jeder Mausklick in meiner Form registriert wird. Ich hätte natürlich gerne nur die, die auf das videoHandle geklickt wurden.

Das klappt jetzt aber auch alles, somit bin ich durch :).

Danke nochmal!
 
Hast du sicher das richtige Handle erwischt? Wenn du dein hWnd der Form übergibst, dann klar, kriegst du alles.