Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249294 (10730)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Externe EXE Datei aufrufen u. DM_DISPLAYFREQUENCY Bitte um H
Andreas Schmid
| Datum:20.12.01 20:12 (a.schmid@freenet.de) |
Wer kann mir weiterhelfen? Nach ewigen ausprobieren und testen ohne Erfolg, bitte ich dringend um eine Hilfe für folgende(s) Problem(e): Ich möchte mit einem erstellten Profan Programm Version 7d eine externe 'autorun.exe' von einem Fremdanbieter zeitgleich aufrufen. Dies geschieht bei der Auswahl "Ja" durch eine Message Box. Funktioniert auch ohne Problem mit @WINEXEC Das Problem ist folgendes: Wenn ich das Profan Programm verlasse, soll eine erneute Abfrage "Message" erfolgen. Dies geschieht durch die AuswahlButtons Ja/Nein, wobei "Ja" ermöglichen soll, das Profan Programm und das zuvor aufgerufene externe Programm gleichzeitig zu schließen. Beispiel: ' Die Profan Datei wird vorab mit einer Message Box gestartet: ........ MessageBox("Abfrage: Ja oder Nein) if @equ(%button,1) ' Hier wird das externe Programm aufgerufen, wenn Ja ausgewählt wurde: @WINEXEC("autorun.exe",1) ........................... endif if @equ(%button,2) end endif ........................... ' Diverser Quelltext ........................... 'Hier wird beendet: PROC Ende MessageBox "Wollen Sie das Demo wirklich beenden?",\ "FRAGE:",36 Case @Equ(%Button,6):Let Ende%=1 ENDPROC Let Ende% = 0 WhileNot Ende% WaitMouse Ende Wend ........................... Anmerkung: Die Option SendMessage(h&,~WM_Quit,0,0) habe ich ausprobiert, jedoch ohne Erfolg. Grund ist auch das ich kein Anhaltspunkt habe, um auf das externe Programm zuzugreifen, legentlich kann ein Beenden durch aufruf des Dateinames des externen Programms erfolgen. Der Quelltext ist mir unbekannt, daher scheidet ein Aufruf über Header oder sowas des externen Programms aus. Ich denke das beste ist, das Programm aus den Speicher zu schmeissen. Jedoch wie das funktionieren könnte, entzieht sich meinen Kenntnissen. Des weiteren sollte die Lösung ab Win95 bis XP einsetzbar sein. ........................... Meine zweite Anfrage bezieht sich auf die Bildschirmauflösung: Wie ist es möglich mit den nachfolgenden Quellcode die DM_DISPLAYFREQUENCY abfragen und einstellen zu können?, sowie nach Beenden des Programms die ursprüngliche Auflösung (bevor das Programm gestartet wurde) automatisch wieder herzustellen??? Anmerkung: Leider ist mir der Autor dieses Quelltextes unbekannt...., auf jedenfall:"Respekt"... ........................... ........................... 'Hier die benötigten Funktionen aus der Win95-API DEF EnumDisplaySettings(3) !"USER32","EnumDisplaySettingsA" DEF ChangeDisplaySettings(2) !"USER32","ChangeDisplaySettingsA" ' changedisplaysettings("Zeiger auf Devmodestruktur", "Flags") ' Hier die Rückgabewerte der Funktion ChangeDisplaySettings, die für eine ' Fehlerbehandlung dienen können ' DISP_CHANGE_BADFLAGS = -4 'falsche/ ungültige Flags (s.unten) ' DISP_CHANGE_BADMODE = -2 'Grafikmodus wird nicht unterstützt ' DISP_CHANGE_FAILED = -1 'Grafiktreiber konnte Modus nicht realisieren ' DISP_CHANGE_RESTART = 1 'eingestellt, aber Neustart erforderlich, 'd.h. kein dynamischer Wechsel mgl. ' DISP_CHANGE_SUCCESSFUL = 0 'alles OK, Wechsel erfolgreich ' hier die Flags, die als zweiter Parameter an die Funktion zu übergeben sind ' CDS_TEST& = 2 ' testet, ob die gewünschte Einstellung möglich ist ' CDS_UPDATEREGISTRY& = 1 ' Einstellung wird in d. Registry ge- ' speichert und gilt auch nach Neustart ' 0 ' dynam. Wechsel, nach Neustart alte ' Bildschirmauflösung wieder gültig ' Variablen deklarieren... declare devmode#,a&,b%,fehl& dim devmode#,148 windowtitle "Bildschirmauflösung ändern" window 10,10-400,400 ' die Funktion EnumDisplaySettings erhält als ' Parameter 1 (0 = aktueller Displaytreiber, unter Win95 immer 0 !, ' Parameter 2 Grafikmodus(eine Zahl b%) und als ' Parameter 3 den Zeiger auf die DEVMODE-STRUKTUR (devmode#)) ' die Funktion füllt die Bereichsvariable devmode# und gibt als ' Rückgabewert (a&) zurück, der 0 ist, wenn die Funktion fehlschlägt. ' Wir rufen die Funktion so lange auf, bis a&=0 ist und erhalten damit alle ' zur Verfügung stehenden Grafikmodi des aktuellen Bildschirmtreibers, die ' auf dem Fenster ausgegeben werden let a&=1 while a& let a&=EnumDisplaySettings(0,b%,devmode#) print "Modus: ";b%;" ";@long(devmode#,108);" x ";@long(devmode#,112);" ";@long(devmode#,104);" Bit" inc b% wend print Print "Bitte drücken Sie eine Taste !" waitkey ' Es werden nur diese Einträge in der Struktur "DEVMODE" benutzt ' Für den ersten Eintrag müssen Flags gesetzt werden: ' DM_BITSPERPEL = 262144 'Eintrag dmBitsPerPel ist gültig ' DM_DISPLAYFLAGS = 2097152 'DM_DISPLAYFLAGS ist gültig ' DM_DISPLAYFREQUENCY = 4194304 'DM_DISPLAYFREQUENCY gültig ' DM_PELSHEIGHT = 1048576 'DM_PELSHEIGHT gültig ' DM_PELSWIDTH = 524288 'DM_PELSWIDTH gültig ' wird eines dieser Flags nicht gesetzt (Addition), dann wird der ent- ' sprechende Eintrag von der Funktion ChangeDisplaySettings nicht verwendet. long devmode#,40=1572864 'dmFields enthält Flags, die festlegen, 'welcher der nachfolgenden Einträge über- 'haupt verwendet werden (s.oben !) 'hier DM_PELSHEIGHT + DM_PELSWIDTH 'long devmode#,104=16 'dmBitsPerPel = Farbtiefe 4,8,16...Bit long devmode#,108=800 'dmPelsWidth = Breite in Pixeln long devmode#,112=600 'dmPelsHeight = Höhe -"- ' möglich, aber für uns bedeutungslos sind auch noch: ' dmDisplayFlags ' dmDisplayFrequency ' Übergabe an die Funktion und Änderung der Bildschirmauflösung let fehl&=ChangeDisplaySettings(devmode#,0) ' Ergebnis, bzw. Fehler ausgeben 'print fehl& cls print "Die Auflösung wurde geändert." print print "Taste...." waitkey ' Hier geht's wieder zurück, ' Werte eintragen und an Funktion übergeben long devmode#,40=1572864 'long devmode#,104=16 - Hierfür müßte oben noch DM_BITSPERPEL addiert werden long devmode#,108=640 long devmode#,112=480 let fehl&=ChangeDisplaySettings(devmode#,0) 'print fehl& cls print "Wieder zurück." print print "Taste zum Beenden..." waitkey end
Thorsten
| Datum:20.12.01 22:08 (mrk@mrk-soft.de) |
HI, Problem 1 ist recht einfach zu lösen, denn WinEXEC übergibt das Handel des Programms. Mit diesem Handel lässt sich allerhand anstellen, unter anderem auch das Programm zu beenden. Beachte, das es 2 Messages dazu gibt, beide machen jedoch etwa sanderes: Message $0010 ,closeWindow, versucht, das Fenster zu schlissen, wärend die Message $0012, wmQiut, das Programm beenden möchte. Thorsten
Andreas Schmid
| Datum: 21.12.01 07:31 (a.schmid@freenet.de) |
Hallo Thorsten! Erst mal Danke für Deine Nachricht. Leider funktioniert weder die Option: Message $0010 closeWindow noch die Message $0012 mit wmqiut das externe aufgerufene Programm (Fremdanbieter, "Kein Profan Programm") zu beenden. Vermutlich setzen diese zwei Optionen ein extern aufgerufenes "Profan" Programm voraus, was jedoch nicht der Fall ist...

| Zurück zur Übersicht