Form-Owner einer anderen Anwendung zuweisen?

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    Form-Owner einer anderen Anwendung zuweisen?

    Hey ho,

    ich habe 2 eigenständige Programme, die aus 2 unterschiedlichen Projekten stammen. Es existiert also keinerlei Zusammenhang.
    Ich starte das Programm1.
    Dieses Programm1 startet dann Programm2.
    Programm2 soll aber so aussehen, als wäre es ein Dialog von Programm1, sodass ich das Programm1 erst wieder schließen kann, wenn ich Programm2 geschlossen habe.

    Ist sowas möglich?

    Danke für Antworten :)

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „TRiViUM“ ()

    TRiViUM schrieb:

    Ist sowas überhaupt möglich?
    Du kannst das Fenster einer anderen Anwendung in ein Panel Deiner Anwendung laden.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. pr = New Process
    3. pr.StartInfo.FileName = "Notepad.exe"
    4. pr.Start()
    5. pr.WaitForInputIdle(1000)
    6. NativeMethods.SetParent(pr.MainWindowHandle, Me.Panel1.Handle)
    7. NativeMethods.ShowWindow(pr.MainWindowHandle, NativeMethods.SW_MAXIMIZE)
    8. End Sub

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class NativeMethods
    3. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    4. Public Shared Function SetParent( _
    5. ByVal hWndChild As IntPtr, _
    6. ByVal hWndNewParent As IntPtr) As IntPtr
    7. End Function
    8. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    9. Public Shared Function ShowWindow( _
    10. ByVal hWnd As IntPtr, _
    11. ByVal nCmdShow As Integer) As Boolean
    12. End Function
    13. Public Const SW_MAXIMIZE As Int32 = 3
    14. <DllImport("user32")> _
    15. Public Shared Function SetWindowPos(hWnd As IntPtr, hWndInsertAfter As IntPtr, x As Integer, y As Integer, cx As Integer, cy As Integer, wFlags As Integer) As Integer
    16. End Function
    17. ' Konstanten für SetWindowPos
    18. Public Const SWP_NOSIZE As Integer = &H1
    19. Public Const SWP_NOMOVE As Integer = &H2
    20. Public Const SWP_NOZORDER As Integer = &H4
    21. Public Const SWP_NOACTIVATE As Integer = &H10
    22. Public Const SWP_DRAWFRAME As Integer = &H20
    23. Public Const SWP_SHOWWINDOW As Integer = &H40
    24. Public Const SWP_HIDEWINDOW As Integer = &H80
    25. Private HWND_TOPMOST As IntPtr = New IntPtr(-1) ' bringt ein fenster an die oberste stelle
    26. Private HWND_NOTOPMOST As IntPtr = New IntPtr(-2) ' bringt ein fenster an die unterste stelle eines containers
    27. Private HWND_BOTTOM As IntPtr = New IntPtr(1) ' bringt ein fenster an die unterste position aller fenster
    28. End Class

    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!

    TRiViUM schrieb:

    .StartInfo
    Da gibt es mehrere Möglichkeiten.
    Du kannst eine StartInfo-Instanz erstellen und eine Process-Instanz mit dieser als Parameter starten
    oder
    Du generierst eine Process-Instanz und befüllst deren StartInfo-Member vod dem Start.
    Das ist völlig äquivalent.
    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!
    ja, der ist schlecht eingerichtet, dein OB - so findet man nur schwer.
    Guggemol ObjectBrowser einrichten , und poste dann nochmal.

    Naja, zur not sieht mans ja auch so, die 6 Start()-Überladungen - dassis eiglich alles, was du brauchst, um eine Fremdanwendung (ja, was wohl?) zu starten.

    Such dir eine aus, deren "Zusammenfassung" dir besonders leicht verständlich erscheint, und wenn dann noch Fragen offen sind - fragen.

    Aber besser wärs, du würdest deinen OB sinniger einrichten.

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

    zähl doch nach: alle Funktionen, die Start() heissen - ich zähle 6.
    Damit kann man Fremdanwendungen starten.
    Noch mal meine Frage: Welche von denen scheint dir am einfachsten zu benutzen, und warum?

    Und wie gesagt: wirf auch einen Blick auf die Signatur, und auf die Summary, die unterhalb noch angezeigt wird - oder wird das bei dir gar nicht (dein Bildle zeigt das nicht).
    Insbesondere die Signatur, inklusive aller Modifizierer, ist sehr wichtig zu verstehen.
    @ErfinderDesRades
    Ups, da ist wohl was durcheinander gekommen...
    hab bei der Funktion Process.Start(...hier die Übergaben gezählt).

    Mir scheint die Process.Start(startInfo As System.Diagnostics.ProcessStartInfo) am einfachsten.
    Eigentlich ja die Process.Start(fileName As String) , aber da kann ich ja quasi kein Owner festlegen (oder?)
    konzentrieren wir uns mal auf die letzte, die sieht doch wirklich einfach aus, oder?
    Zumal auch mit einem StartInfo kannst du keinen Owner festlegen.

    Aber jetzt guck nochmal die komplette Signatur an, inklusive Modifizierer - poste die vlt.
    Und falls dir eine Bedeutung von was unbekannt ist, sag das ruhig - ist besser als einfach weglassen.
    nee, Überladung ist dieselbe Methode, nur mit anneren Argumenten. Oder besser noch: Eine Überladung ist eine ganz andere Methode, nur mit gleichem Namen.
    Und üblicherweise lässt man verschiedene Überladungen auch jeweils dasselbe tun, oder doch zumindest sehr ähnliches.
    "übergebene Werte" - damit meinst du sicher die Argumente (alias "Parameter").
    Grundlagen: Fachbegriffe

    Was ist nun, postest du die komplette Signatur nochmal?
    inklusive Modifier - wie der OB sie dir für die gewählte Start-Überladung unten anzeigt.
    Nun gut, da werd ich mich einmal durcharbeiten - wird bestimmt noch ein paar mehr Begriffe geben :saint:

    Zur Signatur/Modifier:
    Public Shared Function Start(fileName As String) As System.Diagnostics.Process
    Member von System.Diagnostics.Process

    Zusammenfassung:
    Startet eine Prozessressource, indem der Name eines Dokuments oder einer Anwendungsdatei angegeben wird, und ordnet die Ressource einer neuen System.Diagnostics.Process-Komponente zu.

    Parameter:
    fileName: Der Name eines Dokuments oder einer Anwendungsdatei, das bzw. die im Prozess ausgeführt werden soll.

    Rückgabewerte:
    Eine neue System.Diagnostics.Process-Komponente, die der Prozessressource zugeordnet ist, oder null, wenn keine Prozessressource gestartet wird (z. B., wenn ein vorhandener Prozess wiederverwendet wird).

    Ausnahmen:
    System.ComponentModel.Win32Exception: Beim Öffnen der zugeordneten Datei ist ein Fehler aufgetreten.
    System.IO.FileNotFoundException: Die PATH-Umgebungsvariable verfügt über eine Zeichenfolge, die Anführungszeichen enthält.
    System.ArgumentException: Der fileName-Parameter ist null.
    System.ObjectDisposedException: Das Prozessobjekt wurde bereits verworfen.
    Jo, dieses hier:

    VB.NET-Quellcode

    1. Public Shared Function Start(fileName As String) As System.Diagnostics.Process
    ist doch die vollständige Anweisung, wie man eine Fremdanwendung startet.
    Vermutlich musste noch lernen, was Shared bedeutet, und wie man sowas aufruft
    Den Public-Modifier kennste vermutlich, und dann musste dir nur nochmal klarmachen, dass eine Function - im gegensatz zu einer Sub - immer etwas zurückgibt - was ja sehr nützlich ist.
    Ich hab den ObjectBrowser noch nie benutzt, deshalb wusste ich auch nicht, dass sie einen Rückgabewert besitzt - sofern korrekt eingesetzt. Das mit dem Rückgabewert einer Funktion ist bereits im Köpfchen.

    @ErfinderDesRades
    Soviel zum Thema Shared: msdn.microsoft.com/de-de/library/zc2b427x.aspx

    ErfinderDesRades schrieb:

    wie man sowas aufruft

    Falls das so richtig ist:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    3. MessageBox.Show(System.Diagnostics.Process.Start("C:\Programm2.exe").Id)
    4. End Sub
    5. End Class

    oder so:

    VB.NET-Quellcode

    1. Public Shared Function Start(fileName As String) As System.Diagnostics.Process
    2. Return Process.Start(fileName)
    3. End Function
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. MessageBox.Show(Start("C:\Programm2.exe").Id)
    6. End Sub


    bekomme ich dann quasi alle möglichen Infos zu genau den von mir gestarteten Prozess (ID, Ausführungspfad etc...)
    Nur was genau muss ich davon benutzen?

    Ich bin jedenfalls schon mal durchgegangen und hab nix wirklich brauchbares gefunden...

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „TRiViUM“ ()