Hallöle,
den Druckerauswahldialog starte ich ja mit StartPrint "*Auftragsname". Jetzt hüpft der mir aber immer in die linke obere Ecke des Desktops, und ich muß dann mit der Maus hinterhertoben, um das Ding zu bedienen. Das Hauptfenster ist z.b. in der Mitte oder noch weiter weg...
Habt ihr 'ne Idee, wie ich das Biest in meinem Hauptfenster festnageln kann? Also sowas beim Save-Dialog, der bleibt ja auch artig im Hauptfenster...
Druckerauswahldialog positionieren
-
-
-
Da Profan solange nicht weiter arbeitet, solange der Dialog offen ist, hilft es wohl nur vorher mit pExec einen Process zu starten,
der auf den Dialog wartet (FindWindow(0, "Druckereinstellung") und dann per MoveWindow den Dialog verschiebt. -
Danke Thomas, hab jetzt genau diese Variante umgesetzt. Klappt gut mit pExec. Starte damit einfach eine proc aus meinem Hauptprogramm (also keine externe .prc)
1. Darf dieser Prozess auch einen eigenen Timer starten, obwohl im Hauptprogramm schon einer löppt?
2. Mir ist aufgefallen das GetExitCode() immer -1 liefert, nachdem sich mein Prozess wieder beendet hat. Hab eigentl. erwartet, daß ich meinen definierten Exitcode bekomme. Und %ExitCode hat immer den Wert 0.
Oder ist das Normal? Aber ExitCode heißt doch, das der Wert geliefert wird, den ich beim beende mit END definiere, oder?So sieht meine Proc aus, die ich als Prozess mit pExec starte:
Code
Alles anzeigenProc neuerprozess 'wird unmittelbar vor startprint als neuer prozess aufgerufen, um den druckerauswahldialog in eine handliche position zu bringen Parameters x&,y& 'die position, in die der Dialog gebracht werden soll Declare hdf& WindowStyle 112 Window 0,0-0,0 'unsichtbares hauptfenster, damit der timer funzt SetTimer 50 'alle ..ms nach dem druckerauswahldialog schauen While hdf& = 0 WaitInput If %wmtimer = 1 'wenn timer abgelaufen hdf& = FindWindow("Druckeinrichtung") 'handle des auswahldialoges (wenn vorhanden) speichern EndIf EndWhile SetWindowPos hdf& = x&,y& 'Druckerdialog verschieben KillTimer 'wird nicht mehr gebraucht, weil an dieser stelle der dialog ja gefunden ist (abbruchbedingung der schleife) End 4711 'beenden & exitcode erzeugen, damit ich nach dem aufruf prüfen kann, ob sich dieser prozess beendet hat EndProc
Und so ruf ich das denn auf:
-
Freut mich, wenn mein Tipp nützlich war
Zu 1. Selbstverständlich darf diese Process seinen eigenen Timer nutzen, ist ja ein separates Programm. Sonst dürfte man ja nur ein Profan-Programm mit Timer startenDas mit dem Exitcode hab ich nicht getestet. Normallerweise gibt eine Anwendung 0 zurück wenn alles in Ordnung ist und andere Werte sind dann spezifisch, meist für Fehler. Da Du in Deinem Code 4711 angibst, sollte auch 4711 kommen. Könnte ein Bug sein.
-
Der Exitcode wird laut Hilfe zu PExec je nach Aufruf unterschiedlich gehandhabt:
1. Aufruf einer Datei, der Exitcode wird mit End übergeben
2. Aufruf einer Prozedur, der Exitcode wird mit Return (Rückgabewert der Prozedur) übergebenGruß Volkmar
-
hmm, ja...
aber was ist es denn jetzt in diesem Fall? Es ist zwar eine Proc, aber wird ja als seperater Prozess (wie ein Programm?) gestartet. Aber guter Tip, werd mal einfach ein Return einbauen... -
Steht so unter PExec in der Hilfe. Es wird ja eine Prozedur (als eigener Prozess) gestartet. Sollte also mit Return funktionieren.
Gruß Volkmar
-
also auch ein Return 4711 liefert bei GetExitCode() = -1 und %ExitCode ist 0
Aber wenn ich den prozess noch ein wenig laufen lass (z.B. mit sleep 5000) und ich dann schnell die exitcodes abfrage, werden z.B. 259 geliefert. Nur, wenn er sich vorher selbst beendet, wird -1 geliefert - egal, ob ich einen exitcode definiere mit end oder return oder garnicht...
-
nun ja, ich prüf dann jetzt einfach auf ungleich -1, dann kill ich.
Vllt. ist da wirklich noch was buggy...Edit: oder ich versteh das mit dem Exitcode an dieser Stelle einfach falsch
-
In Deiner While : EndWhile noch ein TimeOut einbauen. Wenn also das Timerevent so oft kam, das eine oder ne halbe Minute verbraucht sind, einfach beenden.
Somit hast Du sichergestellt, das sich der Process immer beendet, auch wenn der Druckerdialog nicht gefunden wird.PS: Killtimer ist unnötig, wenn Windows das hWnd des Fensters nicht mehr findet, beendet Windows diesen Timer automatisch. Killtimer am Ende des Programms (Processes) ist also immer unnötig, nur wenn Du den Timer zwischendurch nicht mehr benötigst, solltest Du Ihn killen.
-
Hab mir jetzt noch mal etwas gründlicher die Hilfe angesehen. Der Exitcode funktioniert so nur mit PExecWait. Aber das geht ja in Deinem Fall nicht, Du willst ja noch was tun, während der Prozess läuft. Ansonsten kannst Du mit Exitcode = 259 feststellen, daß der Prozess noch läuft. Weitere Codes stehen unter GetExitcode(N) in der Hilfe.
Gruß Volkmar
-
jo Danke euch Beide
dann ist ja alles bestens. Das mit dem Timeout ist gut - dann hab ich einen Prozess, der sich völlig "eigenverantwortlich" beendet & keinen Aufpasser braucht.Und wir wissen jetzt, daß bei PExec das Ergebnis von GetExitCode() entweder -1 (wenn Prozess nicht mehr da, also beendet) oder einen anderen Wert haben kann (wenn der Prozess noch löppt)
Einen selbst definierten ExitCode gibt es in dieser Variante nicht...Und schon haben wir eine allgemeine Lösung für Druckerdialoge positionieren, wenn man sein Hauptfenster mal nicht im VollbildModus fährt (wird ja bei den großen, hochauflösenden Monitoren immer häufiger)
-
So, nur der Vollständigkeit halber noch mal die "Druckerdialog-Verschiebe-Proc" für einen PExec()-Aufruf, die sich selbstständig verwaltet:
Code
Alles anzeigenProc verschiebDialog 'wird unmittelbar vor startprint als neuer prozess aufgerufen, um den druckerauswahldialog in eine handliche position zu bringen Parameters x&,y& Declare hdf&,zl& WindowStyle 112 Window 0,0-0,0 'unsichtbares hauptfenster, damit der timer funzt SetTimer 60 'alle ..ms nach dem druckerauswahldialog schauen While hdf& = 0 WaitInput If %wmtimer = 1 'wenn timer ausgelöst hdf& = FindWindow("Druckeinrichtung") 'handle des auswahldialoges (wenn vorhanden) speichern Inc zl& 'zählt die timer-auslöser If zl& > 200 'wenn ca. 12 sek (bei timer 60 ms) verstrichen sind (timeout) BREAK 'aus der schleife hüpfen EndIf EndIf EndWhile If hdf& > 0 'wenn kein timeout SetWindowPos hdf& = x&,y& EndIf EndProc
Natürlich hätte ich statt BREAK auch hdf&= -1 setzen können. Nur dann bestünde die Gefahr, daß just das letzte FindWindow()-Ergebnis ein Erfolg war, aber dann durch den Timeout wieder platt gemacht wird.
So funktioniert's perfekt...;-)
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!