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; 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 first:= false; ha:= handleb; end; end; if getwindowinfo(ha,pwi)= false then showmessage('geschlossen'); 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
Hallo Stefan!
Wäre nicht "if first" ausreichend?
PeterPain - Mi 14.05.08 15:45
Titel: Re: getwindowinfo funktioniert nicht richtig
Delphi-Laie hat folgendes geschrieben: |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!