Notepad starten bzw in den Vordergrund holen

  • VB.NET

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

    Notepad starten bzw in den Vordergrund holen

    Hallo,

    Ich möchte aus meinem Programm heraus folgendes machen:
    -Notepad starten und-den „Titel“ von „Unbenannt – Editor“ in „Protokoll“ ändern, beziehungsweise wenn schon ein Notepad mit diesem Titel läuft, dieses in den Vordergrund holen.

    Zum Start habe ich folgendes gefunden:

    Dim ExterneAnwendung As New System.Diagnostics.Process()
    ExterneAnwendung.StartInfo.FileName = "notepad.exe"
    ExterneAnwendung.Start()

    zu den anderen Punkten leider noch nichts.

    Ideal wäre es zudem, wenn ich das notepad so starten könnte, daß es sich quasi wie ein Steuerelement in meinem Programm verhält, also nicht verschiebbar ist. Geht so etwas?


    (in VB6 ging das benennen über SetWindowText, das ‚in den Vordergrund holen über findWindow und ActivateWindow aus der user32-Lib)
    @Phasenverschiebung Start ist so korrekt.
    In den Vordergrund geht über API: SetWindowPos(...)
    Text setzen über SetWindowText(...)
    Das Handle zum Zugriff bekommst Du über die Process-Instanz.
    Gugst Du hier: Andere Programme fernsteuern
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke schon mal, Rod,
    Starten und Text setzen funktioniert, der Rest noch nicht, vielleicht kannst du mir da auch kurz helfen:

    Mit "ProtokollStarten()" starte ich ich notepad und setze den Text ("Protokoll"), jetzt will ich,
    wenn das Dokument bereits geöffnet ist, es in den Vordergrund holen, dazu folgender Code:

    Dim xhWnd As IntPtr = FindWindow("Protokoll", Nothing)
    If xhWnd.Equals(IntPtr.Zero) Then
    Call ProtokollStarten()

    Else
    Call SetWindowPos(xhWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
    End If


    Allerdings liefert mir xhWnd auch dann eine null, wenn notepad "Protokoll" bereits gestartet ist.
    Wo ist mein Denkfehler?

    Gruß, P..
    @Phasenverschiebung Wenn Du das Notepad über Process.Start() startest oder mit Process.GetProcessByName(Notepad) holst, hast Du Deine Instanz und das Handle dafür.
    Nutze dies.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Sorry, ich scheine wohl einfach zu unbegabt zu sein...

    mein Code zum Start:

    Dim ExterneAnwendung As New System.Diagnostics.Process()
    ExterneAnwendung.StartInfo.FileName = "notepad.exe"
    ExterneAnwendung.Start()

    Thread.Sleep(150)
    SetWindowText(ExterneAnwendung.MainWindowHandle, "Protokoll")

    'ProtokollHandle = ExterneAnwendung.MainWindowHandle
    ProtokollHandle = ExterneAnwendung.Handle

    *****************

    zum 'in den Vordergrund holen':

    Call SetWindowPos(ProtokollHandle, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)


    Bei diesem Aufruf bekomme ich aber folgende Fehlermeldung:
    "Ein Aufruf an die PInvoke-Funktion "Test!Test.MDI::SetWindowPos"
    hat das Gleichgewicht des Stapels gestört.
    Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht
    mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie,
    ob die Aufrufkonvention und die Parameter der PInvoke-Signatur
    mit der nicht verwalteten Zielsignatur übereinstimmen."


    Was will mir das sagen?
    Gruß, P..

    Phasenverschiebung schrieb:

    hat das Gleichgewicht des Stapels gestört.
    Da hast Du eine alte Ranz-VB6-Deklaration von SetWindowPos().
    Nimm diese: pinvoke.net/default.aspx/user32.setwindowpos
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    OK, hab die Definition auf die aus deinem Link angepasst.
    Jetzt scheint die Syntax fehlerfrei, allerdings wird mein Notepad nicht in den Vordergrund geholt.
    Woran kann das jetzt noch liegen?

    Aufruf ist:
    bresult = SetWindowPos(ProtokollHandle, HWND_TOPMOST, 0, 0, 0, 0, SetWindowPosFlags.ShowWindow)
    (ProtokollHandle ist vorhanden und <> 0)

    wobei ich mit verschiedenen SetWindowPosFlags schon experimentiert habe.
    bresult ist nach dem Aufruf "true"

    Gruß, P..
    @Phasenverschiebung Probierma, die Flags etwas zu tunen, indem Du sagst, was Du nicht willst:
    (SetWindowPosFlags.ShowWindow | SetWindowPosFlags.NoMove | SetWindowPosFlags.NoSize ...)
    Was Du willst, ist das Ändern der z-Order, SetWindowPosFlags.NoZOrder darf also nicht dabei sein.
    Ansonsten probierma pinvoke.net/default.aspx/coredll.setforegroundwindow

    C#-Quellcode

    1. [DllImport("user32.dll")]
    2. private static extern bool SetForegroundWindow (IntPtr hWnd);
    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).
    VB-Fragen über PN / Konversation werden ignoriert!