Andere Anwendung einfangen

  • VB.NET

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

    Andere Anwendung einfangen

    Hallo an alle!

    Ich habe versucht ein Programm (externes) in einer Visual Basic Form einzufangen:

    VB.NET-Quellcode

    1. ' COM-Interop einbinden.
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. ''' <summary>
    5. ''' Die Klasse beinhaltet die benötigten Api-Funktionen und Konstanten.
    6. ''' </summary>
    7. Public Class Win32Api
    8. ' Die Api Funktion ShowWindow zeigt ein Fenster auf verschiedene Art an.
    9. '
    10. ' Rückgabewert:
    11. ' Ungleich 0 wenn das Fenster vor dem Funktionsaufruf
    12. ' sichtbar war, sonst 0.
    13. ' Übergabewerte:
    14. ' hWnd: Handle des Fensters.
    15. ' nCmdShow: Konstante zum anzeigen des Fensters.
    16. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    17. Public Shared Function ShowWindow( _
    18. ByVal hWnd As IntPtr, _
    19. ByVal nCmdShow As Integer) As Boolean
    20. End Function
    21. ' Die Api Funktion SetParent setzt ein neues Eltern-Fenster für ein
    22. ' bestimmtes Kind-Fenster.
    23. '
    24. ' Rückgabewert:
    25. ' Wenn der Aufruf erfolgreich war wird das Handle des Eltern-Fensters
    26. ' zurückgegeben sonst 0.
    27. ' Übergabewerte:
    28. ' hWndChild: Handle des Kind-Fensters.
    29. ' hWndNewParent: Handle des Eltern-Fensters.
    30. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    31. Public Shared Function SetParent( _
    32. ByVal hWndChild As IntPtr, _
    33. ByVal hWndNewParent As IntPtr) As IntPtr
    34. End Function
    35. ' Das Fenster wird maximiert angezeigt.
    36. Public Const SW_MAXIMIZE As Int32 = 3
    37. ' (SW_...) usw.
    38. End Class
    39. ''' <summary>
    40. ''' Die Prozedur startet die übergebene Anwendung und setzt sie in die aufrufende Form.
    41. ''' </summary>
    42. ''' <param name="CallingApplication">bspw. notepad.exe</param>
    43. ''' <param name="p">Panel-Control, in das die Anwendung eingebettet werden soll</param>
    44. Private Sub SetApplicationAsChild(ByVal CallingApplication As String, _
    45. ByVal p As System.Windows.Forms.Panel)
    46. ' Fehlerbehandlung einschalten.
    47. Try
    48. ' Process starten ( ... notepad.exe ... ).
    49. Dim hProcess As System.Diagnostics.Process = _
    50. System.Diagnostics.Process.Start(CallingApplication)
    51. ' Siehe (... WaitForInputIdle ...)
    52. hProcess.WaitForInputIdle()
    53. ' Parent Fenster setzen.
    54. Win32Api.SetParent(hProcess.MainWindowHandle, p.Handle)
    55. 'Fenster anzeigen.
    56. Win32Api.ShowWindow(hProcess.MainWindowHandle, Win32Api.SW_MAXIMIZE)
    57. Catch ex As Exception
    58. ' Fehlerbeschreibung bei auftretenden Fehler anzeigen.
    59. MessageBox.Show(ex.Message.ToString(), "Info")
    60. End Try
    61. End Sub
    62. Private Sub Button1_Click(ByVal sender As System.Object, _
    63. ByVal e As System.EventArgs) Handles Button1.Click
    64. ' Dateiname des Editors
    65. Const APP_NAME As String = "notepad.exe"
    66. ' Prozedur mit dem Dateiname <APP_NAME> und das benötigte Anzeigefenster aufrufen.
    67. SetApplicationAsChild(APP_NAME, PanelContainer)
    68. End Sub
    69. End Class


    Als erstes, hab ich keine Ahnung wie ich "COM-Interop" einbinden kann, denn es existiert nicht in meiner Liste.
    Und zweitens, funktioniert nur das notepad und keine anderen Programme (Taschenrechner, etc.). Diese werden nicht eingefangen, sondern werden normal geöffnet.

    Ich hoffe, jemand kann mir mal wieder helfen!


    LG
    Alpha11833



    Edit: Bei manchen Programmen (wie Bildschirmlupe) gibts folgende Fehlermeldung: "Fehler bei der Waitforinputidle. Möglicherweise hat der Prozess keine grafische Schnittstelle."

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

    Du brauchst keinen weiteren Verweis.
    Calc.exe wird bei mir eingefangen.
    Gib mal dem WaitForInputIdle() ein paar Millisekunden Latenzzeit mit:

    VB.NET-Quellcode

    1. hProcess.WaitForInputIdle(250)
    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!

    Alpha11833 schrieb:

    Ist doch ein Panel, indem das Programm kommt oder?
    Korrekt.
    Was für ein Programm willst Du denn einfangen?
    Ist Die aufgefallen, dass eine Form ein ParentChanged-Event hat, ein Programm kann also verhindern, dass es eingefangen wird. :S
    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, ok dann eben den Windows Rechner (calc.exe)

    LG

    Edit: Außerdem sagen Skatspieler überlicher Weise nicht "Karte", da sie keine anfordern können.

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

    Alpha11833 schrieb:

    calc.exe
    Unter XP geht es, unter W7 geht es nicht. :S
    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 schrieb:

    Unter XP geht es, unter W7 geht es nicht. :S
    Präzisierung:
    XP-32: Ja,
    W7-32, W7-64: Nein.
    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!

    Alpha11833 schrieb:

    Außerdem sagen Skatspieler überlicher Weise nicht "Karte", da sie keine anfordern können.

    OT: Das sagt der Skatspieler, wenn der, der die nächste Karte auszuspielen hat, wie gebannt auf sein Blatt starrt und nicht entscheiden kann, welche er ausspielen soll. So gesehen wieder OnTopic, da auch hier im Forum manche Poster ihre Karte(n) nur sehr zögerlich ausspielen (sprich, alle relevanten Informationen mitteilen), was es den Antwortenden dann mitunter sehr erschwert, vernünftige Antworten zu geben.

    sams schrieb:

    Was muss ich machen damit es mit "Excel" auch funktioniert?

    RodFromGermany schrieb:

    Ist Die aufgefallen, dass eine Form ein ParentChanged-Event hat, ein Programm kann also verhindern, dass es eingefangen wird. :S
    Sams.Excel entwickeln.
    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!