WndMessage an hidden Form

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    WndMessage an hidden Form

    Hallo Gemeinde,
    gelesen habe ich schon eine Menge, auch zu diesem Thema, wo ich gerade eine Lösung für suche. Das schon mehrere Tage.

    Problemstellung, eine Applikation überwacht Waagen über TCP. Da es da nicht viel zu überwachen gibt, kann der Anwender die Applikation in den Hintergrund schicken "me.hide" oder das Fenster einfach überdecken mit anderen.

    Will der User nun was wissen, kann er wie normal üblich das Programm nach vorne holen, über "NotifyIcon".

    Es hat sich gezeigt das es viel verlangt ist :( , der User startet einfach das Programm erneut.

    Das abzufangen ist leicht, falls das Fenster im Hintergrund liegt.

    VB.NET-Quellcode

    1. Dim myhandle As IntPtr = currentProcess.Handle
    2. If Process.GetProcessesByName(currentProcess.ProcessName).Length > 1 Then
    3. For Each p As Process In pl
    4. If p.ProcessName = My.Application.Info.Title Then
    5. If p.Handle <> myhandle Then
    6. 'SendMessage(p.MainWindowHandle, WM_USER + 5, 0, 0)
    7. SetForegroundWindow(p.MainWindowHandle)
    8. End
    9. End If
    10. End
    11. End If
    12. Next
    13. End If


    Funktioniert auch teilweise ganz gut,

    Der Hacken ist, ich kann die Nachricht nicht fangen, wenn das Fenster ausgeblendet ist
    "me.hide" der FensterHandle "p.MainWindowHandle" hat dann der Wert "0"
    ... und falls das Fenster Minimiert ist, kann der FensterHandle nicht aufgelöst werden.

    Da wäre ich für ein paar Tipps oder Anregungen sehr dankbar.
    Vielleicht die Nachricht an anderer Stelle als in der "Hauptform"
    zu fangen und das aus dem Programm dann selber zu regeln...

    Dank vorab und Grüße,
    Detlef

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

    Willkommen im Forum. :thumbup:

    spacedet schrieb:

    der User startet einfach das Programm erneut.
    Hast Du die Quellen zu diesem Projekt?
    Mach ne SingleInstance-Application draus.
    social.msdn.microsoft.com/Foru…-sub-main?forum=vbgeneral
    Überwache beim Start des Programms, ob es bereits gestartet ist, wenn ja, wechsle zu dieser Instanz.
    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!
    *unnötiges Zitat entfernt*

    Ja, das genau mache ich und das funktioniert wunderbar. Den Codeschnipsel habe ich ja oben reingeschrieben.
    Habe ich beim Splaschscreen_load eingebaut...

    Die Problemstellung ist, das ursprüngliche Fenster nach vorne zu holen.
    "SetForegroundWindow" funktioniert solange das Fenster nur überdeckt ist.
    Jedoch kann man das Hauptfenster auch minimieren, dann geht das nicht mehr, es wird nur das Icon auf der Taskbar aktiviert.
    In den Hintergrund kann man das Programm noch legen, dann teilt es sein Aufmerksamkeitsbedürfnis über ein Notiyfi Icon mit.
    Dann ist die Form unsichtbar, "hide" und ich bekomme die Form nicht nach vorne.
    Versucht habe ich "showWindow" und das senden mit Sendmessage. Ist das Fenster minimiert, oder ausgeblendet, bekomme ich diese Messages leider nicht mehr.

    Das ist die Stelle, an der ich nun rumstehe :(

    Ja die Quellen habe ich natürlich....

    .Mutex muss ich mich einlesen .....
    Danke erst einmal...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @spacedet Kannst Du mal nen Projektrumpf machen, der den Effekt reproduziert (teste dies)?
    Zippe das ohne bin- und obj-Verzeichnis und anhängen.
    Erweiterte Antwort => Dateianhänge => Hochladen.
    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!
    Du könntest zwar vor dem Minimieren der Erstinstanz das MainWindowHandle speichern und zugänglich machen, aber das wär sinnlos Aufwand.

    Falls Du den SplashScreen brauchst, ok, aber schmeiß den Prozessüberwachungskram und das SendMessage-Zeug raus.
    Dann mach in den Projekteinstellungen die App zu einer Einzelinstanzanwendung.
    Dann geh in die Datei Application.Designer.VB (z.B. über den Projektexplorer: MyProject -> Application.myapp -> Application.Designer.VB) und trag dort ein:

    VB.NET-Quellcode

    1. Private Sub MyApplication_StartupNextInstance(sender As Object, e As StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    2. Application.OpenForms(0).Show()
    3. End Sub
    Dieses Ereignis (und somit der Event-Handler) wird automatisch in der Erstinstanz ausgeführt, sobald man versucht, eine 2. Instanz zu starten. Die 2. Instanz wird gar nicht erst gezeigt, sondern sofort beendet und das o.g. Event gefeuert. Der Form-Show-Code funktioniert zwar, damit würde ich aber eine fette Klatsche von Rod bekommen, aber nun kannst Du Dir überlegen, wie Du Deinem Formular "in schöner Form" mitteilst, dass es sich wieder zeigen soll. Hab ne Alternative gefunden.
    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.

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

    @spacedet Wie bereits in Post #2 besprochen:
    SingleInstance,
    MyApplication_StartupNextInstance
    und ne public Prozedur in Form1, die Du in MyApplication_StartupNextInstance ansprechen kannst, hier: der Inhalt von Wiederherstellen_Click.
    Feddich.
    Test.zip
    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!
    Danke, das hat geholfen.
    I owe you a beer!
    At least...

    Habe noch folgende zwei Zeilen ergänzt und das Fenster kommt immer nach vorne, egal ob nur im Hintergrund, oder hidden oder minimiert!

    VB.NET-Quellcode

    1. Application.OpenForms(0).TopMost = True
    2. Application.OpenForms(0).TopMost = False


    DANKE....