Form.Deactivate feuert nicht

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Form.Deactivate feuert nicht

    Neu

    Hi,

    ich habe ein Problem mit der Form.Deactivate Routine ... das Ganze ist etwas komplex .. ich hoffe, ihr habt Geduld mit mir:

    Ich habe zwei Anwendungen ... nur zum Verständnis: das eine ist ein "MediaPlayer" ... und das andere ein "Notepad". In diesem Umfeld nutze ich SprachCDs und mache mir gleichzeitig Notizen.

    Wenn der Media Player läuft soll der Hintergrund des Notepad Fensters hellgrau sein, damit ich "weiß" dass ich nichts eintippen kann (weil die Eingaben sonst in den Media Player gehen ...).

    Zur Illustration habe ich zwei Screenshots angehängt ... einmal ist der MediaPlayer aktiv ... das andere Mal ist der Notepad aktiv.

    Das Ganze habe ich mit den Events ACTIVATE und DEACTIVATE der Notepad-Form gelöst:

    VB.NET-Quellcode

    1. Private Sub FrmNotepadX_Activated(sender As Object, e As EventArgs) Handles Me.Activated
    2. TxtData.BackColor = FormColor


    VB.NET-Quellcode

    1. Private Sub FrmNotepadX_Deactivate(sender As Object, e As EventArgs) Handles Me.Deactivate
    2. TxtData.BackColor = Color.FromArgb(70, 90, 90) 'InactiveColor



    Wie man an den Screenshots sieht, klappt das ja auch ganz hervorragend.

    Leider feuert das Deactivate Event nicht immer ... wie man am dritten Screenshot erkennt .. der MediaPlayer ist aktive und trotzdem ist der Hintergrund des Notepad Fensters schwarz. Das dürfte eigentlich gar nicht vorkommen.

    Ich versucht das "LostFocus" Event zu nutzen ..

    VB.NET-Quellcode

    1. Private Sub FrmNotepadX_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus
    2. Debug.Print("LostFocus")


    Aber dieses Event feuert überhaupt nicht.

    Ich hoffe, ich habe mein Problem verständlich machen können ... um es noch einmal klar zu sagen: wenn das Notepad Fenster inaktiv wird (wenn die Titel Zeile weiß wird) dann soll auch der Hintergrund der TextBox grau werden.

    Ich kann mit dem gelegentlichen Fehler zwar leben ... aber das ist schon sehr lästig.

    LG
    Peter
    Bilder
    • Notepad active.jpg

      71,78 kB, 1.560×260, 35 mal angesehen
    • Media Player active.jpg

      68,34 kB, 1.560×260, 30 mal angesehen
    • Deactivate failed.jpg

      71,59 kB, 1.560×260, 30 mal angesehen

    Neu

    Peter329 schrieb:

    Ich versucht das "LostFocus" Event zu nutzen ..

    ...

    Aber dieses Event feuert überhaupt nicht.


    Damit das funktioniert muss auch das Form den Focus haben. Wenn irgendein Control auf dem Form den Focus hat, wenn das andere Fenster aktiviert wird, tja, wie soll das Form dann den Focus verloren haben? Warum das mit dem deactiveted nicht geht keine Ahnung. Wenn du das nicht hinbekommst, fällt mir nur ein Hook ein(SetWindowHookEx, EVENT_SYSTEM_FOREGROUND).
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Neu

    Tja ... das würde ich auch gern wissen !

    Wenn ich das versuche nachzustellen, klappt das nicht!

    Das Problem tritt sporadisch immer wieder mal auf - ich arbeite in dieser Umgebung manchmal mehrere Stunden - bisher ist mir nichts aufgefallen, was dazu führen könnte, dass das Event Form.Deactivated nicht auftritt, obwohl eine andere Form aktiviert wird. Nur es passiert eben ab und zu.

    Ich habe das Gefühl, dass es sich um einen Fehler im "Windows" handelt ... vielleicht hat ja einer eine Idee wie man das umgehen kann. Vielleicht probiere ich mal den Hook aus ...

    LG
    Peter

    LG
    Peter

    Neu

    Dideldum schrieb:

    Z.B. Ein Timer,


    Na, denk mal an das berühmte Beispiel mit der Türklingel und dem Pizzaboten. Mein Vorschlag mit dem Hook ist auch nicht optimal, aber man bekommt die Info sobald ein anderes Fenster im Vordergrund ist. Da braucht man keinen Timer. Klar ist das mit einem Timer einfacher, aber warum ständig Fragen, wenn man Bescheid bekommen kann?
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DTF“ ()

    Neu

    ok ...

    jau, mit einem Timer könnte man das vermutlich in den Griff bekommen.

    Aber auch mir gefällt so eine Lösung nicht unbedingt ... die Sache mit dem Hook würde ich schon eher in Betracht ziehen.

    Ich hab inzwischen versucht das Problem einzugrenzen. Im Großrechnerbereich nennt man so etwas eine "SlipTrap"... eine Routine, die bestimmte Ereignisse dokumentiert, um sie nachher auszuwerten. Denn mit MsgBox und Konsorten kann man ja nicht arbeiten, weil die sofort Deaktivate Events auslösen ... selbst mit Debug.Print muss man aufpassen, wenn man das Debug Fenster ankllickt. Ein bissl verzwickt die Angelegenheit.

    Für alle, die es interessiert: ich habe einen Debug.Print in die beiden Event Routinen eingebaut und das Programm im Debug Mode ausgeführt.

    Auch nach mehreren Stunden trat der Fehler nicht ein einziges Mal auf!

    Ich hab dann das Modul erstellt und das ohne Debug ausgeführt ...und schon nach der ersten Eingabe trat der Fehler (missing Deacivate Event) auf ! Für mich ist damit klar nachgewiesen, dass es sich um ein Windows Problem handelt.

    Jetzt werde ich den Hook ausprobieren. Mal sehen, ob ich damit klar komme.

    Herzlichen Dank an die Ratgeber ... die mich immerhin darin bestätigt haben, dass ich nicht irgendeinen elemantaren Fehler begehe ... ich melde mich zurück, wenn ich neue Ergebnisse habe.

    LG
    Peter

    Neu

    @Peter329
    Klar, wenn Du ansonsten keinen Timer verwendest, wäre die von @DTF genannte Hook-Methode für Dich geeigneter.
    Ich lasse in meiner Anwendung laufend das derzeit aktive Fenster bzw. dessen Titel ausgeben. Bei Fenstern ohne Titel bekam ich das mit der Hook-Methode nicht hin (liegt aber wahrscheinlich an mir :D ).
    Daher der Timer, in welchem ich u.a. den Handle und Fenstertitel des aktiven Fensters auslese und in der Menuleiste meines Proggis ausgeben lasse.
    Good luck!

    Neu

    Dann müssen wir uns wohl langsam rantasten. Meine .NET-Fx-TestApp hat nur folgende Methode:

    VB.NET-Quellcode

    1. Private Sub FrmMain_Deactivate(sender As Object, e As EventArgs) Handles Me.Deactivate
    2. ListBox1.Items.Add(Date.Now.ToShortDateString)
    3. End Sub
    Und die funktioniert bisher problemlos, im Debug- und Nicht-Debug-Mode. Daher brauchen wir wohl mehr Input Deinerseits.
    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.