Autor | Thema: Externe EXE Datei aufrufen u. DM_DISPLAYFREQUENCY Bitte um H | | 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
|
| | 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
|
| | 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...
|
|
|