Entwickler-Ecke

Windows API - getwindowinfo funktioniert nicht richtig


nepleurepas - So 20.04.08 16:49
Titel: getwindowinfo funktioniert nicht richtig
Hallo,

folgende timerprocedure soll mir sagen, wann ein fenster geschlossen wurde:

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

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 - So 11.05.08 08:11

Hallo, nimm die IsWindow() API.


BenBE - 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.


Delphi-Laie - Mi 14.05.08 15:32
Titel: Re: getwindowinfo funktioniert nicht richtig
user profile iconnepleurepas hat folgendes geschrieben:
if first=true


Hallo Stefan!

Wäre nicht "if first" ausreichend?


PeterPain - Mi 14.05.08 15:45
Titel: Re: getwindowinfo funktioniert nicht richtig
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 - Fr 16.05.08 16:50
Titel: Re: getwindowinfo funktioniert nicht richtig
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

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).


Delete - 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 - 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.