Entwickler-Ecke
Windows API - Der Code macht nicht das was ich will !!! Helft mir bitte !!
matze - Mo 30.09.02 21:07
Titel: Der Code macht nicht das was ich will !!! Helft mir bitte !!
Hallo !!!
Ich habe aus folgender Post
http://www.auq.de/viewtopic.php?t=2145 den Code von MathiasSimmack in mein Proggi eingebaut (Danke nochmal an dieser Stelle !!!).
Hier nochmal der Code:
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; |
Dieser Code schliesst, wenn die Variable
WebBrowserOnly auf
true steht alle Browserfenster. Wenn sie auf
false steht, werden alle aktiven Fenster geschlossen. Soweit klappt alles !!!
Ich wollte aber ausserdem noch, dass MEIN proggi, egal was passiert immer ausgelassen wird, sprich: offen bleicbt auch wenn alle anderen Fenster geschlossen werden (webbrowseronly := false).
Dazu hat MathiasSimmack folgenden Code gepostet:
Quelltext
1: 2:
| Browserfenster if(not(WebBrowsersOnly)) or (pos(buf,browser_classes) <> 0) and (not(buf = 'TForm1') then |
Was leider nicht funzt.
Ich habe dann (wieder mit Hilfe von MathiasSimmack) das folgendermassen umgeändert:
Quelltext
1: 2:
| if((not(WebBrowsersOnly)) or (pos(buf,browser_classes) <> 0)) and ((Wnd <> Form1.Handle) AND (Wnd <> Application.Handle)) then |
Das funzt aber auch nicht
Kann mir bitte jemand sagen warum !!!
Delete - Mo 30.09.02 21:21
Also noch mal, matze.
Ich habe hier jetzt mal einen Code zum Ausprobieren für dich:
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: 29:
| 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 ShowMessage(buf);
// PostMessage(Wnd, WM_SYSCOMMAND,lParam,0); end;
Result := true; end;
procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@CloseAll,SC_CLOSE); end; |
Button auf die Form, Code rein und ausprobieren.
Die Kommentare sind absichtlich drin. Schließlich wollte ich meinen offenen Mozilla nicht schließen. :) Ich lasse mir also nur die Klassennamen anzeigen, und ich sehe neben anderen Fenstern auch "TForm1" und "TApplication" - die in dem Fall zu meiner Anwendung gehören.
Wie deine Form heißt, weiß ich nicht, aber zumindest bis hier sollte es auch bei dir funktionieren.
Wenn du die Bedingungsprüfung jetzt mal so änderst:
Quelltext
1: 2:
| if((not(WebBrowsersOnly)) or (pos(buf,browser_classes) <> 0)) and ((Wnd <> Form1.Handle) and (Wnd <> Application.Handle)) |
dann siehst du nur noch die Klassennamen der anderen Fenster. Der Name deiner Form und das dazu gehörende (!) "TApplication"-Fenster tauchen nicht mehr auf.
Wenn du jetzt das ShowMessage entfernst und stattdessen wieder die "PostMessage"-Anweisung aktivierst, dann werden alle Programme beendet - nur eben deins nicht.
Bei mir geht es also.
Es wäre aber hilfreich, wenn du sagst,
was bei dir nicht klappt.
matze - Di 01.10.02 11:54
:dance: :dance: Hosaa, holldrio, super, jubel, heiterkeit :dance: :dance: usw...
Es KLAPPT !!!!!!
Jetzt würde mich nur mal interessieren: warum klappt das jetzt und das alte nicht :?!?: :nixweiss:
Und noch ne Frage: Wie muss ich den Code umbauen, wenn ich das fenster killen statt schliessen will ??
das geht doch irgendwie über TerminateProcess oder ???
matze - Do 03.10.02 17:48
kann mir jemadn sagen, wie ich die Fensterklassen für word usw... rausbekomme ??
Motzi - Do 03.10.02 18:44
@matze: entweder mit den Tools Spy++ [Microsoft], WinSight [Borland] oder aber dem X-Spy [ich :mrgreen:] Link für den X-Spy:
http://motzi.fs-tools.de (gibt auch einen Thread unter Freeware wo man Kommentare, Bug-Reports, etc. loswerden kann)
(03.10.02 20:16 Tino) Signatur entfernt. Siehe Richtlinien.
matze - Do 03.10.02 18:57
danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!