Hallo an alle!
Ich habe versucht ein Programm (externes) in einer Visual Basic Form einzufangen:
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."
Ich habe versucht ein Programm (externes) in einer Visual Basic Form einzufangen:
VB.NET-Quellcode
- ' 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 = "notepad.exe"
- ' Prozedur mit dem Dateiname <APP_NAME> und das benötigte Anzeigefenster aufrufen.
- SetApplicationAsChild(APP_NAME, PanelContainer)
- End Sub
- 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“ ()