KeyDown-Fehler beim Anzeigen einer Form

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    KeyDown-Fehler beim Anzeigen einer Form

    Tach allerseits :)

    So bin mal wieder am Proggen und hab ein kleines Problem:

    Beim Aufruf von Form2.Show() kommt der Fehler:

    System.InvalidOperationException: Nachricht = Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Das Ereignis KeyDown ist für dieses ActiveX-Steuerelement ungültig..

    HIntergrund: Es soll auf einer Form2 ein WindowsMediaPlayer Videos im Vollbildmodus anzeigen und die Tastenanschläge abfangen, um das Video zu pausieren. Bisher hatte ich den Code dafür in der Form2_KeyDown(). Das hat aber nicht funktioniert (bei Tastenanschlag passierte gar nichts), dann hab ich den Code in die WindowsMediaPlayer_KeyDown() verschoben. Dann trat der Fehler auf. Und auch beim rückgänigig machen des Verschiebens tritt jetzt auf einmal dieser Fehler auf...

    Ihr braucht bestimmt noch weitere Codezeilen oder Infos, bitte einfach kurz schreiben, was von Relevanz sein könnte... Ich weiss ehrlich gesagt nicht, wo ich da anfangen soll...
    Du hast den Thread mit VB6 getaggt. Ist dem so oder arbeitest Du mit Visual Studio und somit VB.NET? Ich tippe auf VB.NET.

    kafffee schrieb:

    Das hat aber nicht funktioniert (bei Tastenanschlag passierte gar nichts)
    Da musst Du beim Form KeyPreview auf True einstellen, damit da was ankommt.
    Wenn KeyDown für ein ActiveX-Control nicht zur Verfügung steht, dann isses eben so.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    kafffee schrieb:

    Beim Aufruf von Form2.Show() kommt der Fehler:
    Verstehe wieder einmal diesen Thread:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    Du hast den Thread mit VB6 getaggt. Ist dem so oder arbeitest Du mit Visual Studio und somit VB.NET? Ich tippe auf VB.NET.


    Ich hab mich aus Versehen verklickt beim Erstellen des Threads, sorry dafür, ich hab das gerade behoben...

    VaporiZed schrieb:

    Da musst Du beim Form KeyPreview auf True einstellen, damit da was ankommt.


    OK das funktioniert. Aber nur beim ersten Video. Sobald ich ein zweites lade und anzeige, wird das Ereignis nicht mehr ausgelöst (ich hab das überprüft, es liegt wirklich daran, dass das KeyDown-Event nicht ausgelöst wird). Kann das sein, dass meine Form irgendwie den Fokus verliert?

    kafffee schrieb:

    Kann das sein, dass meine Form irgendwie den Fokus verliert?
    Ja.
    Das hängt ganz von Deinem Code ab.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier der Code, so wie er ist (einige Zeilen hätte ich mir wohl wahrscheinlich sparen können):

    EDIT: Ok hat geklappt, ich hab in Zeile 34 noch ein Me.Focus() eingefügt.

    VB.NET-Quellcode

    1. Public Sub Uhr()
    2. If Startbildschirm.ListBox1.Items.Count = 0 Then
    3. MessageBox.Show("Im ausgewählten Ordner sind keine unterstützten Dateien!")
    4. Me.Hide()
    5. Startbildschirm.Show()
    6. Else
    7. Me.Focus()
    8. If Startbildschirm.ListBox2.Items(Zaehler).ToString.ToLower.EndsWith(".avi") Or Startbildschirm.ListBox2.Items(Zaehler).ToString.ToLower().EndsWith(".mp4") Or Startbildschirm.ListBox1.Items(Zaehler).ToString.ToLower().EndsWith(".avi") Or Startbildschirm.ListBox1.Items(Zaehler).ToString.ToLower().EndsWith(".mp4") Then
    9. Timer1.Stop()
    10. AxWindowsMediaPlayer1.Top = 0
    11. AxWindowsMediaPlayer1.Left = 0
    12. AxWindowsMediaPlayer1.Height = Me.Height
    13. AxWindowsMediaPlayer1.Width = Me.Width
    14. PictureBox1.Enabled = False
    15. PictureBox1.Visible = False
    16. AxWindowsMediaPlayer1.Enabled = True
    17. AxWindowsMediaPlayer1.Visible = True
    18. If Startbildschirm.chkZufall.Checked = True Then
    19. AxWindowsMediaPlayer1.URL = CStr(Startbildschirm.ListBox2.Items(Zaehler)) 'ListBox2 beinhaltet die Dateinamen in zufälliger Reihenfolge
    20. Else
    21. AxWindowsMediaPlayer1.URL = CStr(Startbildschirm.ListBox1.Items(Zaehler)) 'ListBox1 beinhaltet die Dateinamen in sortierter Reihenfolge
    22. End If
    23. Do While AxWindowsMediaPlayer1.playState <> WMPLib.WMPPlayState.wmppsPlaying 'was diese drei nächsten Zeilen verstehe ich nicht, ich hab das von irgendwoher übernommen
    24. Application.DoEvents()
    25. Loop
    26. AxWindowsMediaPlayer1.fullScreen = True
    27. AxWindowsMediaPlayer1.Ctlcontrols.play()
    28. If Zaehler = Startbildschirm.ListBox2.Items.Count - 1 Then
    29. Zaehler = 0
    30. Else
    31. Zaehler = Zaehler + 1
    32. End If
    33. Else
    34. [...] 'Dieser Code ist für Bilddateien, funktioniert aber einwandfrei...
    35. Timer1.Stop()
    36. PictureBox1.Left = 0
    37. PictureBox1.Top = 0
    38. PictureBox1.Size = New Size(Me.Width, Me.Height)
    39. Timer1.Interval = CInt(Startbildschirm.numSekundenzahl.Value * 1000)
    40. Timer1.Enabled = True
    41. PictureBox1.Enabled = True
    42. PictureBox1.Visible = True
    43. AxWindowsMediaPlayer1.Enabled = False
    44. AxWindowsMediaPlayer1.Visible = False
    45. If Startbildschirm.chkZufall.Checked = True Then
    46. PictureBox1.Image = Image.FromFile(CType(Startbildschirm.ListBox2.Items(Zaehler), String))
    47. Else
    48. PictureBox1.Image = Image.FromFile(CType(Startbildschirm.ListBox1.Items(Zaehler), String))
    49. End If
    50. Timer1.Start()
    51. If Zaehler = Startbildschirm.ListBox2.Items.Count - 1 Then
    52. Zaehler = 0
    53. Else
    54. Zaehler = Zaehler + 1
    55. End If
    56. End If
    57. End If
    58. End Sub


    Aufgerufen wird er beim ersten Video mit:

    VB.NET-Quellcode

    1. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. TimerOn = True
    3. Zaehler = 0
    4. Timer1.Interval = CInt(Startbildschirm.numSekundenzahl.Value * 1000)
    5. MessageBox.Show("SPACE: nächstes Bild/Video" & Environment.NewLine & "KLICK: pausieren" & Environment.NewLine & "ESC: beenden")
    6. Uhr()
    7. End Sub


    und bei einem Tastenanschlag mit:

    VB.NET-Quellcode

    1. Private Sub Form2_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. If e.KeyCode = Keys.Escape Then
    3. Zaehler = 0
    4. Timer1.Stop()
    5. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    6. Me.Hide()
    7. Startbildschirm.ListBox2.DataSource = New String() {}
    8. 'Startbildschirm.ListBox2.Refresh()
    9. Startbildschirm.ListBox1.Items.Clear()
    10. Startbildschirm.Show()
    11. ElseIf e.KeyCode = Keys.Space Then
    12. MessageBox.Show("keydownklappt")
    13. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    14. Uhr()
    15. End If

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „kafffee“ ()

    Ich denke mal, dass der Unterschied darin besteht, dass Form2 initial da ist bzw. den Fokus hat oder nicht.
    Setze beim Start des 2. Videos einfach den Fokus auf Form2.
    Da gibt es SetForegroundWindow() und SetFocus(), sieh Dir beides an.
    pinvoke.net/default.aspx/user32.setforegroundwindow
    pinvoke.net/default.aspx/user32.setfocus
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!