Einbindung von Fremdanwendungen

  • VB.NET
  • .NET (FX) 4.0

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

    Einbindung von Fremdanwendungen

    Moin Leute,
    hab da mal wieder was für die richtigen Experten unter Euch...

    Ich muss eine Fremdanwendung (Spezieller Image Editor - Tobit David.fx) in meine Form einbauen. Ich habe natürlich viele Artikel dazu gefunden wie z.B. diesen Beitrag in unserem Forum VB-PARADISE
    oder auch im vb@rchiv.
    Soweit so gut. Folgendes Problem:

    Die Einbindung funktioniert nur ab und zu. Oftmals verschwindet die Anwendung und das Fenster bleibt verschwunden. Gibt es für vbnet eine zuverlässige Methode, ein Fremdes Fenster in meine Form zu integrieren?
    Option B wäre, dass ich das externe Fenster z.B. rechts an meine Form angänge und die größe definiere. Das kann ich mit meinen eigenen Formen ja ohne Probleme machen aber ich weiß absolut nicht wie ich das mit einer Fremdanwendung machen soll.

    Besten Dank schonmal :)
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @exc-jdbi ich habe ja genau diese API verwendet. Hin und wieder wird die Fremdanwendung nicht geladen und das Fenster verschwindet. Wieso weiß ich nicht genau.

    VB.NET-Quellcode

    1. Dim pr As Process = New Process
    2. pr.StartInfo.FileName = "C:\Program Files\Tobit InfoCenter\DVEDIT32.EXE"
    3. pr.Start()
    4. pr.WaitForInputIdle(1000)
    5. Form1.SetParent(pr.MainWindowHandle, Me.SplitContainer1.Panel2.Handle)
    6. Form1.ShowWindow(pr.MainWindowHandle, Form1.SW_MAXIMIZE)


    Liegt es an meinem Aufruf? Was läuft schief?

    Option 2 vlt. eine Idee?
    Externes Fenster einfach anders positionieren und Größe ändern?
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    Hallo razzzer530i

    Ich hab das jetzt mit der "Notepad.exe" und auch mit der "wordpad.exe" ausprobiert. Bei mir funkst das einwandfrei.
    Die von dir erwähnten Programme besitze ich leider nicht. Wüsste jetzt nicht wo das Problem ist.

    Arbeitest du mit Windows?

    Hast du schon versucht mit der NativeMethods-Klasse, etwa so. Der Code kann direkt in die Form1_Load eingepackt werden.

    VB.NET-Quellcode

    1. pr = New Process
    2. pr.StartInfo.FileName = "C:\Program Files\Tobit InfoCenter\DVEDIT32.EXE"
    3. pr.Start()
    4. pr.WaitForInputIdle(1000)
    5. NativeMethods.SetParent(pr.MainWindowHandle, Me.SplitContainer1.Panel2.Handle) 'Oder in ein Panel
    6. NativeMethods.ShowWindow(pr.MainWindowHandle, NativeMethods.SW_MAXIMIZE)



    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „exc-jdbi“ ()

    razzzer530i schrieb:

    eine Idee
    Machst Du:
    Form1.XXX ==> Me.XXX.
    Gugst Du hier.
    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!
    Funktioniert mit allen externen Programmen nur mit dem was ich benötige nicht....
    Bleibt mir wohl doch nur die Option das Fenster der Anwendung neben meins zu hängen.

    Andere Idee ist eben aus den .001 Dateien( die aus dem Tobit) imagews zu erstellen. aber wie weiß ich nicht.


    @exc-jdbi ich arbeite mit Windows und notepad usw. funktiniert. Nur der David rotz nicht...
    Habe jetzt auch mal die NativeMethods klasse zu nehmen. Bringt mich leider nicht witer...
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    die NativeMethods klasse
    kapselt ausschließlich API-Methoden von Windows.
    Die bringt Dir gar nix.
    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!
    @exc-jdbi Hilft mir leider nicht. Mal geht es, mal geht es nicht. Wie gesagt mit Editor oder Word geht es immer.

    @RodFromGermany Jap. Hilft mir ja leider so oder so nicht.
    Mir bleibt anscheinend nur die Option, das Fenster der anderen Anwendung zu positionieren und seine Größe zu ändern. Kann mir da jemand helfen? Eigene Form weiß ich, wie ich das ganze aber bei ner fremden Form mache weiß ich nicht...
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @razzzer530i Es gibt Anwendungen, die sich sträuben, wenn sie ein anderes oder überhaupt ein Parent untergejubelt bekommen.
    Da muss man einfach das richtige Event abonieren und entsprechend reagieren:

    VB.NET-Quellcode

    1. Private Sub Form1_ParentChanged(sender As Object, e As EventArgs) Handles MyBase.ParentChanged
    2. Me.Parent = Nothing
    3. End Sub
    Was genau soll denn mit dem Fenster Deiner Fremdanwendung geschehen?
    Gugst Du vielleicht mal hier, wenn Du das Fenster manipulieren willst.
    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!
    @RodFromGermany Ich möchte das externe Fenster rechts von meinem Fenster mit der selben Höhe und definierter Breite positionieren. Wie ich das mit ner 2. eigenen Form mache weiß ich aber ich weiß nicht wie ich das mit nem externen Programm mache.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    rechts von meinem Fenster mit der selben Höhe und definierter Breite positionieren
    geht so. Das Stichwort heißt Docking:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <Flags>
    4. Enum Swp As Integer
    5. NoSize = &H1
    6. NoMove = &H2
    7. NoZorder = &H4
    8. NoRedraw = &H8
    9. NoActivate = &H10
    10. FrameChanged = &H20 ' the frame changed: send wm_nccalcsize
    11. ShowWindow = &H40
    12. HideWindow = &H80
    13. NoCopyBits = &H100
    14. NoOwnerZorder = &H200 ' don't do owner z ordering
    15. NoSendChanging = &H400 ' don't send wm_windowposchanging
    16. End Enum
    17. <DllImport("user32")> _
    18. Private Shared Function SetWindowPos(hWnd As IntPtr, hWndInsertAfter As IntPtr, _
    19. x As Integer, y As Integer, width As Integer, height As Integer, uFlags As Swp) As Boolean
    20. End Function
    21. Private pr As Process
    22. Private WndHandle As IntPtr
    23. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    24. Me.pr = Process.Start("Notepad.exe")
    25. Me.pr.WaitForInputIdle(500)
    26. Me.WndHandle = Me.pr.MainWindowHandle
    27. Me.FollowMe()
    28. End Sub
    29. Private Sub Form1_LocationChanged(sender As Object, e As EventArgs) Handles MyBase.LocationChanged
    30. Me.FollowMe()
    31. End Sub
    32. Private Sub FollowMe()
    33. Dim x = Me.Right
    34. Dim y = Me.Top
    35. Dim w = Me.Width
    36. Dim h = Me.Height
    37. If Me.WndHandle <> IntPtr.Zero Then
    38. SetWindowPos(Me.WndHandle, New IntPtr(-1), x, y, w, h, Swp.NoZorder Or Swp.ShowWindow)
    39. End If
    40. End Sub
    41. 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!