Autor Beitrag
nepleurepas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164

Win XP

BeitragVerfasst: So 20.04.08 16:49 
Hallo,

folgende timerprocedure soll mir sagen, wann ein fenster geschlossen wurde:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var first: boolean = true;  // global deklariert, damit trotz timer der wert erhalten wird
var handleb: Thandle;   //   "" ""

procedure TForm2.Timer1Timer(Sender: TObject);
var handlea: Thandle;
var ha: Hwnd;
var pwi: tagWINDOWINFO;
begin

if first=true then
 begin
 handleb:= findwindow(nil,'Der quantenmechanische Doppelspaltversuch');
 if handleb<>0 then begin              //sobald das fensterhandle erkannt wurde, wird 
                    first:= false;
                    ha:= handleb;
                    end;
 end;
 if getwindowinfo(ha,pwi)= false then showmessage('geschlossen');  //überprüft ob es gültig

end;


Die Idee is folgende. Zu anfang wird das handle des fensters gesucht und dann nichtmehr verändert, sobald es einen konkreten wert erhalten hat. Dies passiert, indem first auf false gesetzt wird.
Dann wird mit getinfo nur noch überprüft, ob das handle noch gültig ist oder nicht.
Leider liefert getinfo immer gleichzeitig true und false!! D.h. egal ob ich mache
 if getwindowinfo(ha,pwi)=false then ... oder
ausblenden Delphi-Quelltext
1:
if getwindowinfo/ha,pwi)=true then...					

es erscheint immer die showmessage botschaft im timerintervall. Außerdem spielt es überhaupt keine rolle, ob das fenster geschlossen wurde oder nicht...

Wäre dankbar für jede hilfe
stefan
toms
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: So 11.05.08 08:11 
Hallo, nimm die IsWindow() API.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 12.05.08 00:54 
Entweder das, oder initialisiere die tagWINDOWINFO-Struktur vor deren Benutzung. Die WinAPI möchte in nahezu jeder Struktur deren Größe wissen. Siehe MSDNLib für mehr Details.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 14.05.08 15:32 
user profile iconnepleurepas hat folgendes geschrieben:
if first=true


Hallo Stefan!

Wäre nicht "if first" ausreichend?
PeterPain
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 83



BeitragVerfasst: Mi 14.05.08 15:45 
user profile iconDelphi-Laie hat folgendes geschrieben:
user profile iconnepleurepas hat folgendes geschrieben:
if first=true


Hallo Stefan!

Wäre nicht "if first" ausreichend?



Nicht nur ausreichend, sondern stark zu empfehlen. Man sollte Booleans niemals direkt auf trueoder falseüberprüfen, sondern immer entweder if Bool oder if not Bool verwenden.

gruss
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Fr 16.05.08 16:50 
Zitat:
Wäre nicht "if first" ausreichend?
Nicht nur ausreichend, sondern stark zu empfehlen. Man sollte Booleans niemals direkt auf trueoder falseüberprüfen, sondern immer entweder if Bool oder if not Bool verwenden.


Nun ja, daß es eigentlich überflüssig ist, so kenne ich es auch. Allerdings kann es m.E. auch nicht schaden, es ist eben bloß etwas redundant.

Aber warum verwendet z.B. Luckie in seiner Funktion "GetExeStringFromProcID" die Audrücke
ausblenden Delphi-Quelltext
1:
2:
3:
if Process32First(hProcSnap, pe32) = true
...
while Process32Next(hProcSnap, pe32) = true
?

Irgendetwas wird er sich dabei gedacht haben, und er gehört zu den Delphi-Größen, denen so schnell keiner etwas vormacht.

Ich habe allerdings testweise seine =true-Vergleiche entfernt (weil sie eben nach meinen Kenntnissen nur redundantisch sind), und siehe da, mit den "nackten" boolschen Variablen funktionieren seine Prozeduren bei mir bisher auch immer zu meiner Zufriedenheit (oder ich habe Aussetzer noch nicht als solche bemerkt).
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 16.05.08 19:37 
Ich nehme an, das ist noch recht alter Code von mir. heute würde ich es auch nicht mehr so machen.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Fr 16.05.08 19:47 
Danke, daß Du prompt reagiert hast, Luckie!

Ich fand das in den Quelltexten Deiner WinInfo.

Dann bin ich ja beruhigt, daß da doch keine Geheimwissenschaft hintersteckt.