Hallo!
Folgenden Quellcode habe ich bei Euch aus´m Forum:
' COM-Interop einbinden.
Imports System.Runtime.InteropServices
Public Class Form1
''' <summary>
''' Die Klasse beinhaltet die benötigten Api-Funktionen und Konstanten.
''' </summary>
Public Class Win32Api
' Die Api Funktion ShowWindow zeigt ein Fenster auf verschiedene Art an.
'
' Rückgabewert:
' Ungleich 0 wenn das Fenster vor dem Funktionsaufruf
' sichtbar war, sonst 0.
' Übergabewerte:
' hWnd: Handle des Fensters.
' nCmdShow: Konstante zum anzeigen des Fensters.
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function ShowWindow( _
ByVal hWnd As IntPtr, _
ByVal nCmdShow As Integer) As Boolean
End Function
' Die Api Funktion SetParent setzt ein neues Eltern-Fenster für ein
' bestimmtes Kind-Fenster.
'
' Rückgabewert:
' Wenn der Aufruf erfolgreich war wird das Handle des Eltern-Fensters
' zurückgegeben sonst 0.
' Übergabewerte:
' hWndChild: Handle des Kind-Fensters.
' hWndNewParent: Handle des Eltern-Fensters.
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function SetParent( _
ByVal hWndChild As IntPtr, _
ByVal hWndNewParent As IntPtr) As IntPtr
End Function
' Das Fenster wird maximiert angezeigt.
Public Const SW_MAXIMIZE As Int32 = 3
' (SW_...) usw.
End Class
''' <summary>
''' Die Prozedur startet die übergebene Anwendung und setzt sie in die
' aufrufende Form.
''' </summary>
''' <param name="CallingApplication">bspw. notepad.exe</param>
''' <param name="p">Panel-Control, in das die Anwendung eingebettet
' werden soll</param>
Private Sub SetApplicationAsChild(ByVal CallingApplication As String, _
ByVal p As System.Windows.Forms.Panel)
' Fehlerbehandlung einschalten.
Try
' Process starten ( ... notepad.exe ... ).
Dim hProcess As System.Diagnostics.Process = _
System.Diagnostics.Process.Start(CallingApplication)
' Siehe (... WaitForInputIdle ...)
hProcess.WaitForInputIdle()
' Parent Fenster setzen.
Win32Api.SetParent(hProcess.MainWindowHandle, p.Handle)
'Fenster anzeigen.
Win32Api.ShowWindow(hProcess.MainWindowHandle, Win32Api.SW_MAXIMIZE)
Catch ex As Exception
' Fehlerbeschreibung bei auftretenden Fehler anzeigen.
MessageBox.Show(ex.Message.ToString(), "Info")
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' Dateiname des Editors
Const APP_NAME As String = "ControlCenter"
' Prozedur mit dem Dateiname <APP_NAME> und das benötigte
' Anzeigefenster aufrufen.
SetApplicationAsChild(APP_NAME, Panel1)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
End Sub
End Class Das funktioniert soweit auch super (getestet bei Notepad, Calculator und Writer). Nehme ich jedoch ein Programm, wie bspw. WinWord, dann klappts nicht mehr! Das Programm wird zwar geöffnet, aber nicht in meinem Child-Fenster!
Wieso ist das so? Programme mit vorgeschalteter Anmeldemaske machen auch Probleme!
Kann mir jemand von Euch behilflich sein? Es muss doch eine Möglichkeit geben ein komplettes Programm in ein Fenster meines Programms zu integrieren!?
Herzliche Grüße und vielen Dank! |