Hallo,
Wie kann man einen Prozess z.b. ICQ in die eigene Anwendung einbetten ?
Geht das überhaupt ? Und wenn ja wie ?
Vorneweg - es geht.
Für das Beispiel braucht ihr ein Panel, zwei Button und eine Listbox.
In der Listbox führe ich alle in frage kommenden Prozesse auf.
Durch Button1 wird die Anwendung in die eigene Integriert und verschwindet aus den Prozessen.
Durch Button2 wird die Anwendung wieder in die Freiheit entlassen.
Aber nun genug - hier der Code
Interessant wäre es, ob das ganze auch ohne Api - rein durch das Framework - umsetzbar ist.
Kommentare erwünscht.
Gruss
mikeb69
Wie kann man einen Prozess z.b. ICQ in die eigene Anwendung einbetten ?
Geht das überhaupt ? Und wenn ja wie ?
Vorneweg - es geht.
Für das Beispiel braucht ihr ein Panel, zwei Button und eine Listbox.
In der Listbox führe ich alle in frage kommenden Prozesse auf.
Durch Button1 wird die Anwendung in die eigene Integriert und verschwindet aus den Prozessen.
Durch Button2 wird die Anwendung wieder in die Freiheit entlassen.
Aber nun genug - hier der Code
VB.NET-Quellcode
- 'Imports System.Runtime.InteropServices
- Public Class Form1
- 'benötigte api's
- Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal flag As Integer) As IntPtr
- Private Declare Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
- 'showwindow konstanten
- Private Const SW_NORMAL As Integer = 1
- Private Const SW_MAXIMIZE As Integer = 3
- 'handle des eingebetteten fensters merken
- Private h As IntPtr
- 'timer zum aktualisieren der prozess liste
- Private WithEvents t As New Timer
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- 'wenn ein eintrag aus der listbox ausgewählt wurde,
- 'kann dieser prozess auch aufgerufen und eingebettet werden
- If Me.ListBox1.SelectedItem IsNot Nothing Then
- SetApplicationAsChild(Me.ListBox1.SelectedItem, Me.Panel1)
- End If
- End Sub
- ''' <summary>Einbetten der Anwendung in die eigene Form.</summary>
- ''' <param name="CallingApplication">Die einzubettende Anwendung.</param>
- ''' <param name="p">Panel, in das die Anwendung eingebettet werden soll.</param>
- Private Sub SetApplicationAsChild(ByVal CallingApplication As String, ByVal p As System.Windows.Forms.Panel)
- Dim hProcess As System.Diagnostics.Process = Process.GetProcessesByName(CallingApplication)(0)
- If hProcess.MainWindowHandle <> 0 Then
- ' Parent Fenster setzen.
- SetParent(hProcess.MainWindowHandle, p.Handle)
- 'hProcess.WaitForInputIdle()
- 'Fenster anzeigen.
- ShowWindow(hProcess.MainWindowHandle, SW_MAXIMIZE)
- 'handle merken, um beim freigeben weniger stress zu haben
- h = hProcess.MainWindowHandle
- Me.Button1.Enabled = False
- Me.Button2.Enabled = True
- Else
- MessageBox.Show("Kein gültiges Fensterhandle - Anwendung kann nicht eingebettet werden.")
- 'Me.Button1.Enabled = True
- 'Me.Button2.Enabled = False
- End If
- End Sub
- Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- 'eingebettete anwendung wieder freigeben
- ReleaseApplicationAsChild()
- End Sub
- Private Sub ReleaseApplicationAsChild()
- 'parent der anwendung wieder löschen
- SetParent(h, Nothing)
- 'fenster der anwendung anzeigen
- ShowWindow(h, SW_NORMAL)
- 'button sperren
- Me.Button2.Enabled = False
- Me.Button1.Enabled = True
- End Sub
- Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- 'wenn eine anwendung gefangen wurde, beim beenden freilassen
- If Button2.Enabled = True Then
- ReleaseApplicationAsChild()
- End If
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- 'button sperren
- Me.Button2.Enabled = False
- Me.Button1.Enabled = True
- 'button texte setzen
- Me.Button1.Text = "Anwendung einbetten"
- Me.Button2.Text = "Anwendung freigeben"
- 'timer starten
- t.Interval = 1000
- t.Start()
- End Sub
- Private Sub t_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles t.Tick
- 'prozessliste aktualisieren - um alle geöffneten fenster erfassen zu können
- t.Stop()
- Dim index As Integer = Me.ListBox1.SelectedIndex
- 'alle prozesse die einen fenstertitel haben in die listbox eintragen
- Me.ListBox1.Items.Clear()
- For Each p As Process In Process.GetProcesses
- If p.MainWindowTitle <> "" Then
- Me.ListBox1.Items.Add(p.ProcessName)
- End If
- Next
- Me.ListBox1.SelectedIndex = index
- t.Start()
- End Sub
- End Class
Interessant wäre es, ob das ganze auch ohne Api - rein durch das Framework - umsetzbar ist.
Kommentare erwünscht.
Gruss
mikeb69