Autor |
Beitrag |
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Do 12.09.02 19:01
also ich bin mir nicht sicher, in welche sparte das gehört.
Meine Frage:
Wie kann ich alle Netscape/IE fenster auf einmal schliessen ??
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 12.09.02 20:59
Schöne Frage. Hier ein Auszug aus meinem Tool "Speedy":
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| var WebBrowsersOnly : boolean = false;
function CloseAll(Wnd: hWnd; lparam: LPARAM): longbool; stdcall; const browser_classes : string = 'IEFrame|MozillaWindowClass|BLDOPERA'; var buf : array[0..MAX_PATH - 1]of char; begin if(WebBrowsersOnly) then GetClassName(Wnd,buf,80);
if(not(WebBrowsersOnly)) or (pos(buf,browser_classes) <> 0) then begin if((GetWindowLong(Wnd, GWL_STYLE) and (WS_VISIBLE or WS_SYSMENU)) = (WS_VISIBLE or WS_SYSMENU)) then PostMessage(Wnd, WM_SYSCOMMAND,lParam,0); end;
Result := true; end;
{ ... }
begin WebBrowsersOnly := true; EnumWindows(@CloseAll,SC_CLOSE); end; |
Die Funktion ist ausgelegt auf den IE, den Mozilla und den Opera (getestet mit Opera5). Und sie lässt sich auch dazu benutzen, Fenster zu minimieren (SC_MINIMIZE) oder zu maximieren (SC_MAXIMIZE).
Und wenn du "WebBrowsersOnly" auf false setzt, bezieht sich das auf alle offenen (normalen) Programmfenster. 
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Fr 13.09.02 08:42
OK danke !!
Aber ich vertehe folgende Zeile nicht Quelltext 1: 2: 3: 4:
| begin WebBrowsersOnly := true; EnumWindows(@CloseAll,SC_CLOSE); end; |
was soll das machen ?? Kannst du mir das bitte erklären ?
Matze
PS: Was ist den den Speedy Tool ?? Wo bekommt man das her ? Homepage ?
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Fr 13.09.02 12:00
hi matze,
Wenn du die erste Zeile des Codes nicht verstehst (WebBrowsersOnly := True), dann verweise ich mal auf folgende Textstelle in MathiasSimmacks Post:
Zitat: | Und wenn du "WebBrowsersOnly" auf false setzt, bezieht sich das auf alle offenen (normalen) Programmfenster. |
Zu EnumWindows habe ich hier einen kleinen Auszug aus der PSDK:
Zitat: |
The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.
Syntax
BOOL EnumWindows( WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
Parameters
lpEnumFunc
[in] Pointer to an application-defined callback function. For more information, see EnumWindowsProc.
lParam
[in] Specifies an application-defined value to be passed to the callback function.
Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
If EnumWindowsProc returns zero, the return value is also zero. |
Ich hoffe, ich konnte dir helfen.
_________________ Viele Grüße
Jakob
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 13.09.02 18:21
Danke, DeCodeGuru.
@matze: Du wolltest doch folgendes wissen:
Zitat: | Meine Frage:
Wie kann ich alle Netscape/IE fenster auf einmal schliessen ?? |
Antwort: mit einer Funktion, die sich alle geöffneten Fenster "ansieht" (bitte nicht wörtlich nehmen) und dann entscheidet, wie mit dem jeweiligen Fenster zu verfahren ist.
Du könntest z.B. auch eine while-Schleife missbrauchen und solange laufen lassen, solange du ein IE-, Netscape- oder sonstiges Fenster findest. Aber das wäre tatsächlich "Missbrauch"  , denn das System stellt mit "EnumWindows" eine geeignete und bessere Möglichkeit zur Verfügung.
Also, wirf mal einen Blick in die API-Hilfe, oder in den PSDK-Auszug, den dir DeCodeGuru gezeigt hat.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Fr 13.09.02 19:17
@ Codeguru: Ich haba mit der Frage hauptsächlich das EnumWindows(@CloseAll,SC_CLOSE); gemeint. (ist anscheinend nicht so rübergekommen.....
@MathiasSimmack: Ich verstehe dein Posting nicht. Ich denke der Code den du gepostet hast schliesst alle Fenster oder wahleise alle Browserfenster.
Achja:
Matze hat folgendes geschrieben: | PS: Was ist den den Speedy Tool ?? Wo bekommt man das her ? Homepage ? |
Und nochne Frage: Wenn ich alle Fenster schliessen lasse, wie kann ich meins dann offen halten ?
Könnte man das so machen: erst den Befehl zum fenster schliessen und dann sein ShellExecute mit ParamStr(0) ?? Oder wie ?
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 14.09.02 09:02
matze hat folgendes geschrieben: | @ Codeguru: Ich haba mit der Frage hauptsächlich das EnumWindows(@CloseAll,SC_CLOSE); gemeint. (ist anscheinend nicht so rübergekommen..... |
Doch, kam doch rüber - er hat dir den PSDK-Codeauszug gepostet.
Zitat: | @MathiasSimmack: Ich verstehe dein Posting nicht. Ich denke der Code den du gepostet hast schliesst alle Fenster oder wahleise alle Browserfenster. |
Ja, tut er doch auch. Durch die Variable "WebBrowsersOnly" entscheidest du, ob nur die Browserfenster oder eben alle geschlossen werden sollen. Das Schließen passiert durch die Übermittlung von SC_CLOSE an die Funktion "CloseAll". Gib stattdessen doch mal SC_MINIMIZE an und sag mir was dann passiert.
Zitat: | Und nochne Frage: Wenn ich alle Fenster schliessen lasse, wie kann ich meins dann offen halten ?
Könnte man das so machen: erst den Befehl zum fenster schliessen und dann sein ShellExecute mit ParamStr(0) ?? Oder wie ? |
Könnte man, ist aber zu umständlich. Wenn du mit der VCL ein Programm geschrieben hast, dann hat dein Formular doch einen Namen wie TForm1 oder so. Den kannst du als Klassennamen verwenden. Ausgehend von diesem Vorschlag änderst du die Funktion wie folgt ab:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| function CloseAll(Wnd: hWnd; lparam: LPARAM): longbool; stdcall; const browser_classes : string = 'IEFrame|MozillaWindowClass|BLDOPERA'; var buf : array[0..MAX_PATH - 1]of char; begin // IN JEDEM FALL den Klassennamen lesen GetClassName(Wnd,buf,80);
// wenn "alle Fenster", // bzw. der Klassenname entspricht einem der Browserfenster if(not(WebBrowsersOnly)) or (pos(buf,browser_classes) <> 0) and // und wenn der Klassenname NICHT "TForm1" ist // (weil das dein Fenster wäre) (not(buf = 'TForm1') then begin // dann SCHLIESSEN, MINIMIEREN, weiß der Geier was ... if((GetWindowLong(Wnd, GWL_STYLE) and (WS_VISIBLE or WS_SYSMENU)) = (WS_VISIBLE or WS_SYSMENU)) then PostMessage(Wnd, WM_SYSCOMMAND,lParam,0); end;
Result := true; end; |
Jetzt alle Klarheiten beseitigt?
Zitat: | PS: Was ist den den Speedy Tool ?? Wo bekommt man das her ? Homepage ? |
Speedy stammt ursprünglich von Markus Rath und wurde 199 1 in der DOS INTERNATIONAL veröffentlicht. Es war nur in der TNA zu sehen und bot Zugriff auf ... auf was eigentlich? ... das weiß ich selbst nicht mehr. Na, jedenfalls habe ich den Quellcode in meinem Schnipselarchiv wiedergefunden und nach Delphi umgesetzt und gehörig erweitert. Du kannst also jetzt den Bildschirmschoner auswählen, starten und aktivieren/deaktivieren. Du kannst alle Fenster minimieren/maximieren/schließen  . Du kannst den Autostart für CD-ROMs usw. kontrollieren. Du kannst den Papierkorb öffnen/leeren. Du kannst via Doppelklick auf das TNA-Symbol eine der eben genannten Aktionen selbst festlegen und auslösen lassen.
Das ganze Ding läuft ohne die VCL und daher ist der Programmcode mit ca. 30k gerade mal 6k größer als der Delphi-Quelltext.
Kann man hier an seine Postings eigentlich Dateien anhängen?
Wenn ja, würde ich das machen. Groß ist es ja nicht.
@Tino:
PS: Sorry, Speedy wurde natürlich nicht ´91 sondern ´97 veröffentlicht. 1991 gab´s noch kein Windows9x und damit natürlich auch keinen TNA-Bereich.
Und es konnte den Bildschirmschoner starten oder aktivieren/deaktivieren und via Doppelklick alle offenen Fenster schließen. Die ganzen anderen Funktionen, die ich erwähnt habe, sind also von mir hinzugefügt worden.
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Sa 14.09.02 12:15
SUUUUUUUPER !!! Danke vielmals an dich, du hast mir extrem geholfen.
Und jetzt nur nochmal zur absicherung:
wenn ich den geänderten Programmcode aus deiner letzten Post einbaue und dann z.B. in einem Button Quelltext 1: 2: 3: 4:
| begin WebBrowsersOnly := true; EnumWindows(@CloseAll,SC_CLOSE); end; | aufrufe werden alle Fenster oder alle Browser fenster (abhängig von der Var) geschlossen ABER mein Fenster bleibt offen. Richtig so ?
PS: Soviel ich weiss ist in der Standardinstallation die Tino warscheinlich für das Board hergenommen hat keine Funktion für Datei anhänge implementiert.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 14.09.02 12:32
matze hat folgendes geschrieben: | Und jetzt nur nochmal zur absicherung:
wenn ich den geänderten Programmcode aus deiner letzten Post einbaue und dann z.B. in einem Button ... aufrufe werden alle Fenster oder alle Browser fenster (abhängig von der Var) geschlossen ABER mein Fenster bleibt offen. Richtig so ? |
Ich hoffe es, denn das war nur aus dem Kopf geändert. Ungetestet!
Diese Sicherung gilt aber dann auch für alle Programme, die -wie im Beispiel!- den Namen TForm1 benutzen. Du solltest für dein Programm also einen möglichst eindeutigen Namen für die Form benutzen, sonst bleiben evtl. noch andere Fenster offen.
PS: ich sehe gerade so:
Quelltext
 Habe ein bisschen geträumt. Mach mal ein:
Quelltext
draus (bzw. mit dem Namen deiner Form).
PPS: Speedy (9k)
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Sa 14.09.02 13:33
MathiasSimmack hat folgendes geschrieben: | Kann man hier an seine Postings eigentlich Dateien anhängen? |
Nein, leider nicht. Aber eine andere Möglichkeit hast Du ja schon gezeigt:
MathiasSimmack hat folgendes geschrieben: | PPS: Speedy (9k) |
Gruß
TINO
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Sa 14.09.02 13:39
Zitat: | Nein, leider nicht. |
Warum eigentlich nicht? Macht das die Forensoftware nicht mit? Oder ist der Speicherplatz zu kann? Ich meine, nicht jeder hat einen Webspace, auf den er die Sachen hochladen kann.
_________________ Viele Grüße
Jakob
|
|
matze 
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: Sa 14.09.02 16:58
also ich denke mal das PhPBB2 nicht mitmacht und ich weiss aus zuverlässiger Quelle dass die Leute beim Flashforum, die Datei Upload für Posts anbieten mitlerweile knapp 30 GB an files aufm server liegen haben und pro tag ca 40 MB dazukommen !!!!
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|