externes Programm zum Harmonieren bringen

Für allgemeine Fragen zur Programmierung mit PureBasic.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

externes Programm zum Harmonieren bringen

Beitrag 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. 8)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: externes Programm zum Harmonieren bringen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: externes Programm zum Harmonieren bringen

Beitrag von es_91 »

Hey wieso geht das jetzt auf einmal bei mir? :o :?

/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?

Bild
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. . . :|
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: externes Programm zum Harmonieren bringen

Beitrag von RSBasic »

Entferne mal den Parent-Parameter. Ich habs zwar nicht getestet, aber vielleicht ist das die Ursache.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: externes Programm zum Harmonieren bringen

Beitrag von es_91 »

Oh, jetzt geht es wunderbar. :allright:

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! :D
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: externes Programm zum Harmonieren bringen

Beitrag von HeX0R »

Du schickst doch schon die WindowID, also solltest du im external.exe nicht nochmal WindowID drum rum machen.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: externes Programm zum Harmonieren bringen

Beitrag von es_91 »

Tatsächlich. DAS war der Fehler. :o

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! 8)

/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.
Antworten