Seite 1 von 1
externes Programm zum Harmonieren bringen
Verfasst: 13.06.2014 11:31
von es_91
Ich hab wieder 'was für Euch.
Ich versuche, ein externes Programm ein Window anzeigen zu lassen. Währenddessen (d.h. bis zum Schließen des Fensters durch den Anwender) soll die Programmausführung des startenden Programms angehalten werden. So sieht mein Sample aus:
externaltest.pb --> ausführen!
Code: Alles auswählen
window = OpenWindow(#PB_Any, 0, 0, 630, 340, "irgendetwas", #PB_Window_SystemMenu)
menu = CreateMenu(#PB_Any, WindowID(window))
MenuItem(001, "Klick mich zum Start des externen Programms!")
Repeat
Until WaitWindowEvent() = #PB_Event_Menu And EventMenu() = 001
RunProgram("external.exe", "meinParameter" + Space(1) + Str(WindowID(window)), "")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
external.pb --> vorkompilieren zu external.exe!
Code: Alles auswählen
If ProgramParameter() = "meinParameter"
window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 320, 200, "Dies ist ein ChildWindow", #PB_Window_SystemMenu, WindowID(Val(ProgramParameter(1))))
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
CloseWindow(window)
End
EndIf
Wie ihr selber seht, geht das nicht so wie ich es mir wünsche und ich weiß nicht, warum.
Das startende Programm (externaltest.pb) soll in seiner Ausführung nagehalten werden, bis das Fenster von external.pb geschlossen wird.
Bitte helft mir.

Re: externes Programm zum Harmonieren bringen
Verfasst: 13.06.2014 12:12
von RSBasic
Hm keine Ahnung, ob ich dich richtig verstanden habe, aber #PB_Program_Wait wäre eigentlich das, was du suchst oder?
Das heißt: externaltest.exe startet external.exe und während der Laufzeit von external.exe muss externaltest.exe warten und kann nicht bedient werden.
Re: externes Programm zum Harmonieren bringen
Verfasst: 13.06.2014 12:23
von es_91
Hey wieso geht das jetzt auf einmal bei mir?
/EDIT: Und jetzt geht's wieder nicht. Was ist hier nur los?
/EDIT2: Also eben ging es genau einmal, nachdem ich den Computer einige Minuten stehen gelassen habe. Nun geht es wieder nicht. Windows bringt mir eine Fehlermeldung, sagt "external.exe funktioniert nicht mehr" und will es abschießen. Währenddessen hängt die Anwendung von externaltest.pb, wie es ja auch sein soll.
Ich brauche das für ein größeres Projekt und dort geht es genau so wenig wie in diesem Beispiel hier.
Mal schauen, ob's nochmal geht, wenn ich den Computer in den Ruhezustand versetze und es danach nochmal versuche...
/EDIT3: Ich glaube es nicht. Nach dem Herauffahren aus dem Ruhezustand geht es tatsächlich wieder! Wie kann das sein?
RSBasic hat geschrieben:Hm keine Ahnung, ob ich dich richtig verstanden habe, aber #PB_Program_Wait wäre eigentlich das, was du suchst oder?
Da hast Du Recht, das hatte ich einzubauen vergessen, aber das löst ja nicht das Problem, was ich jetzt habe.
/EDIT4: Ich bin am Verzweifeln. Denn jetzt geht es gar nicht mehr. . .

Re: externes Programm zum Harmonieren bringen
Verfasst: 13.06.2014 12:44
von RSBasic
Entferne mal den Parent-Parameter. Ich habs zwar nicht getestet, aber vielleicht ist das die Ursache.
Re: externes Programm zum Harmonieren bringen
Verfasst: 13.06.2014 12:48
von es_91
Oh, jetzt geht es wunderbar.
externaltest.pb
Code: Alles auswählen
window = OpenWindow(#PB_Any, 0, 0, 630, 340, "irgendetwas", #PB_Window_SystemMenu)
menu = CreateMenu(#PB_Any, WindowID(window))
MenuItem(001, "Klick mich zum Start des externen Programms!")
Repeat
Until WaitWindowEvent() = #PB_Event_Menu And EventMenu() = 001
RunProgram("external.exe", "meinParameter", "")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
external.pb --> external.exe
Code: Alles auswählen
If ProgramParameter() = "meinParameter"
window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 320, 200, "Dies ist ein ChildWindow", #PB_Window_SystemMenu)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
CloseWindow(window)
End
EndIf
Wie gesagt, vorher ging es einmal und dann einmal nicht, besonders häufig ging es nachdem ich den Laptop in den Ruhezustand oder in den Energiesparmodus versetzte.
Also gut, dann muss ich eben ohne 'ParentID' auskommen. Danke dafür!

Re: externes Programm zum Harmonieren bringen
Verfasst: 13.06.2014 12:49
von HeX0R
Du schickst doch schon die WindowID, also solltest du im external.exe nicht nochmal WindowID drum rum machen.
Re: externes Programm zum Harmonieren bringen
Verfasst: 13.06.2014 12:52
von es_91
Tatsächlich. DAS war der Fehler.
Code: Alles auswählen
If ProgramParameter() = "meinParameter"
window = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 320, 200, "Dies ist ein ChildWindow", #PB_Window_SystemMenu, Val(ProgramParameter(1)))
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
CloseWindow(window)
End
EndIf
Code: Alles auswählen
window = OpenWindow(#PB_Any, 0, 0, 630, 340, "irgendetwas", #PB_Window_SystemMenu)
menu = CreateMenu(#PB_Any, WindowID(window))
MenuItem(001, "Klick mich zum Start des externen Programms!")
Repeat
Until WaitWindowEvent() = #PB_Event_Menu And EventMenu() = 001
RunProgram("external.exe", "meinParameter" + Space(1) + Str(WindowID(window)), "")
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Vielen, vielen Dank!
/EDIT:
~~~~~~~~ Noch ein Hinweis ~~~~~~~~
Wenn ihr jemals, so wie ich in dem letzten oberen Beispiel, eine 'WindowID' an ein Unterprogramm übermitteln wollt und dabei das Hauptfenster behindern wollt, müsst ihr im Hauptprogramm noch folgenden oder ähnlichen Code einbauen:
Code: Alles auswählen
While Not AvailableProgramOutput(Program)
If WaitWindowEvent(1) = #Null
DisableWindow(Window, #True)
EndIf
Wend
Output$ = ReadProgramString(Program)
DisableWindow(Window, #False)
... ansonsten hängt eines von beiden Programmen oder das Ergebnis ist nicht das erwartete.