Exe in programm einbinden

mahlzeit

ich hab folgendes problem
ich will eine exe einbinden aber nicht
das es sich in einem fenster öffnet sondern in
meinem programm angezeigt wird.
kann ich das mit einem frame erreichen?
ich hab schon gegooglet aber leider nix gefunden.

gruß fressbrett

Hallo,

also, das kannst du glaube ich vergessen. Denn ein Anwendung, die unter Windows laeuft, bekommt von Windows einen eigenen Adressraum zugewiesen und erzeugt ihre Ausgabefenster selbst. Die Ausgabe umzulenken auf ein anderes Fenster ist meines Wissens nicht moeglich.

Um das zu erreichen muesstest du einen eigenen Termialserver implementieren…

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ich will eine exe einbinden aber nicht
das es sich in einem fenster öffnet sondern in
meinem programm angezeigt wird.

hmmm, ich bin nicht sicher, ob ich Dich richtig verstanden habe.

Probier mal den Code hier, den Pfad mußte ich bei mir zwar anpassen, aber sonst läuft’s …

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function Putfocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
Const GW\_HWNDNEXT = 2
Dim mWnd As Long
Function InstanceToWnd(ByVal target\_pid As Long) As Long
 Dim test\_hwnd As Long, test\_pid As Long, test\_thread\_id As Long
 'Find the first window
 test\_hwnd = FindWindow(ByVal 0&, ByVal 0&amp:wink:
 Do While test\_hwnd 0
 'Check if the window isn't a child
 If GetParent(test\_hwnd) = 0 Then
 'Get the window's thread
 test\_thread\_id = GetWindowThreadProcessId(test\_hwnd, test\_pid)
 If test\_pid = target\_pid Then
 InstanceToWnd = test\_hwnd
 Exit Do
 End If
 End If
 'retrieve the next window
 test\_hwnd = GetWindow(test\_hwnd, GW\_HWNDNEXT)
 Loop
End Function
Private Sub Form\_Load()
 'KPD-Team 1999
 'URL: http://www.allapi.net/
 'E-Mail: [email protected]
 Dim Pid As Long
 'Lock the window update
 LockWindowUpdate GetDesktopWindow
 'Execute notepad.Exe
 Pid = Shell("c:\windows\notepad.exe", vbNormalFocus)
 If Pid = 0 Then MsgBox "Error starting the app"
 'retrieve the handle of the window
 mWnd = InstanceToWnd(Pid)
 'Set the notepad's parent
 SetParent mWnd, Me.hwnd
 'Put the focus on notepad
 Putfocus mWnd
 'Unlock windowupdate
 LockWindowUpdate False
End Sub
Private Sub Form\_Unload(Cancel As Integer)
 'Unload notepad
 DestroyWindow mWnd
 'End this program
 TerminateProcess GetCurrentProcess, 0
End Sub

Meinst Du das?

Gruß, Rainer

Hallo,

wenn Du das Fenster in einen Frame, statt in die Form ‚einsperren‘ willst, mußt Du statt …

SetParent mWnd, Me.hwnd

… Me.hwnd (Handle der Form) das Handle des Frames übergeben.
Beispiel:

SetParent mWnd, Frame1.hWnd

… oder wie dein Frame auch immer heißt.

Gruß, Rainer

Also so weit klappt und sieht das alles ganz gut aus.
aber ich möchte nicht das es einfach nur frei beweglich ist im fenster sondern das es seinen festen platz hat. wenn ich jetzt zu einer anderen form wechsel und wieder zurück komme wird es ja neu geöffnet.
vielleicht mal ne kleine erklärung was ich machen will:
wie vielleicht bekannt schreibe ich im moment an einem programm für im auto. mit media steuerung und so.
jetzt will ich halt noch die navigation einbinden.

Hallo,

Also so weit klappt und sieht das alles ganz gut aus.

Gut.

aber ich möchte nicht das es einfach nur frei beweglich ist im
fenster sondern das es seinen festen platz hat.

Schiebe es doch beim Start so weit nach oben, daß man die Titelleiste nicht sieht, dann kann man es nicht verschieben. :smile: Wenn Du die Titelleiste sehen willst, kannst Du ja ein durchsichtiges Steuerelement darüber legen.

wenn ich jetzt
zu einer anderen form wechsel und wieder zurück komme wird es
ja neu geöffnet.

Keine Ahnung, ob das Probleme macht, wirst Du sehen.

vielleicht mal ne kleine erklärung was ich machen will:
wie vielleicht bekannt schreibe ich im moment an einem
programm für im auto. mit media steuerung und so.
jetzt will ich halt noch die navigation einbinden.

Ja, weiß ich. :smile:

Gruß, Rainer

Hm irgendwie hat die letzte antwort von rainer
mir nicht so ganz weitergeholfen :wink:
es ist halt so das diese exe mitten in der form geladen werden soll und von daher ist es schon schlecht wenn die exe ne eigene titelleiste hat.
und wie gesagt auch das es neu geladen wird wenn
man die form wechselt bzw zurück kommt.

Hallo,

also wie du das Prog in deine Anwendung bekommst das weisst du ja nun. Soweit ich weiss kannst du es aber nicht direkt positionieren :frowning:.
Der Anwender hat aber später die Chance diese Anwendung innerhalb deiner Anwendung mit der Maus zu verschieben.
Je nachdem was es für eine Anwendung ist, so müsstest du die Bereiche (wo man die einzubindende Anwendung verschieben kann (Titelleiste, Min, Max Button)) mit einem „transparenten“ Steuerelement belegen, so das sie überdeckt werden. Diese Steuerelemente kannst du ja unter VB mittels der Eigenschaft Move anpassen.

Erstelle dazu 1 Label. Setze die Caption Eigenschaft auf „“. Nun weisst du der Backcolor Eigenschaft den wert vom Backcolor des Frames zu.
Bedenke aber bitte dabei das du die Systemfarben nicht direkt auslesen kannst.

Bsp. dim color
color=frame1.backcolor 'Schlegt fehl, wenn es sich um eine Systemfarbe handelt

Abhilfe schafft hierbei folgender Trick.

Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long

Public Type typRGB
 Red As Integer
 Green As Integer
 Blue As Integer
End Type


Public Function RGBColor(ByVal Color As OLE\_COLOR) As typRGB 
On Error Resume Next
 If (Color And &HFF000000) = &H80000000 Then Color = GetSysColor(Color And &HFFFFFF)
 RGBColor.Red = (Color And &HFF&amp:wink:
 RGBColor.Green = (Color And &HFF00&amp:wink: / &H100
 RGBColor.Blue = (Color And &HFF0000) / &H10000
End Function

Private Sub Konvert()
dim color as long
dim sColor as typRGB
sColor=RGBColor(Frame1.backcolor)
frame1.backcolor=RGB(sColor.Red,sColor.Green,sColor.Blue)
end sub

Private Form\_Load()
 call Konvert
end sub

Mit diesem Trick kannst du nun ganz normal auf die Backcolor Eigenschaft des Frames zugreifen. Auch wenn es sich um eine Systemfarbe handelt :smile:

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Mr. „fressbrett“
Es gibt eine Methode.
Und zwar ist auf der professional CD von VB5 ein Beispiel für einen Bildschirmschoner.
Da ist ne Menge Code drin, den Du aber nicht brauchst, kannst Du ja entfernen. So etwas ähnliches sollte man auch im Internet finden können.
Und zwar brauchst Du nur den Code, welcher die Anwendung in einem anderen Fenster darstellt, aber das Problem ist, der screensaver macht das alles selber, bzw. er bekommt auch die Daten dafür(windows handle der Vorschau).
Mit den Funktionen der api’s sollte es aber klappen, denn alle windows handles eines laufenden Programms lassen sich ermitteln.
Anderes Problem: Die Größe des Programm-windows soll in Dein Programm-window passen, und eventuell muss auch noch der ursprüngliche copyright-Inhaber damit einverstanden sein, weil da ja sonst ein anderer Autor des Programms erscheint.
Es gibt meines Wissens extra spezielle Firmen, welche sich auf das Instanzieren und „Fernsteuern“ von Anwendungen spezialisiert haben.
Dabei erhält im wesentlichen das child-programm alle Nachrichten vom parent-programm, die es ansonsten vom User bekommen sollte.
MfG
Matthias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

also das mit der hintergrund farbe des bedeckendes frames ist so
ne sache da meine hintergründe variable bilder sind aber das ist auch net so wichtig.
viel wichtiger ist daß das programm nicht bei jedem show befehl der form neu geladen wird.
ich weiß jetzt nicht wie das heißt aber es gibt ne funktion die prüft ob ein programm schon geöffnet ist und zwar über den task.
aber das programm wird so viel ich weiß gar net in der taskleiste angezeigt.
würde es trotzdem funktionieren es dann über if in den griff zu bekommen??

mfg
fressbrett