Entwickler-Ecke
Windows API - hook notwendig?
nepleurepas - Mi 16.04.08 22:00
Titel: hook notwendig?
Hallo,
ich möchte mitbekommen, wann ein Fenster, dessen handle ich kenne, geschlossen wird.
meine frage nun, ist es dafür notwendig, hooks einzusetzen?
Hab mir mal das hook tutorial in der library angeschaut und jetz auf anhieb leider nich so viel verstanden...:-(, daher eben die Frage, ob ich mir die ganze materie aneignen muss, oder obs da ne einfachere möglichkeit gibt.
danke für antworten
gruß stefan
BenBE - Mi 16.04.08 22:35
Gehört das Fenster zu nem ganzen Prozess, der beendet wird, wenn das Fenster geschlossen wird???
Wenn ja, kannst Du einfach mit OpenProcess ein Handle auf den Prozess öffnen und mit WaitForSingleObject auf diesen Prozess warten ...
Delete - Do 17.04.08 09:21
BenBE hat folgendes geschrieben: |
Gehört das Fenster zu nem ganzen Prozess, der beendet wird, wenn das Fenster geschlossen wird???
Wenn ja, kannst Du einfach mit OpenProcess ein Handle auf den Prozess öffnen und mit WaitForSingleObject auf diesen Prozess warten ... |
Ein sich schliessendes Fenster signalisiert nicht, nur Prozesse tun das.
Einfachste Lösung wär in regelmäßigen Abständen eine Fensterliste zu erstellen und zu gucken, ob das betreffende Handle noch in der Liste ist.
BenBE - Do 17.04.08 09:43
Luckie hat folgendes geschrieben: |
BenBE hat folgendes geschrieben: | Gehört das Fenster zu nem ganzen Prozess, der beendet wird, wenn das Fenster geschlossen wird???
Wenn ja, kannst Du einfach mit OpenProcess ein Handle auf den Prozess öffnen und mit WaitForSingleObject auf diesen Prozess warten ... |
Ein sich schliessendes Fenster signalisiert nicht, nur Prozesse tun das. |
@Luckie: Ich weiß, daher in der ersten Zeile meine Frage zwecks Prozessbeeindigung. Dass Fenster nicht signalisieren, ist mir klar ... manchmal les ich sogar die MSDNLib ;-)
Luckie hat folgendes geschrieben: |
| Einfachste Lösung wär in regelmäßigen Abständen eine Fensterliste zu erstellen und zu gucken, ob das betreffende Handle noch in der Liste ist. |
Wozu ne ganze Fensterliste, wenn man nur ein Fenster überwachen will? Regelmäßig nach
diesem einen Fenster suchen, sollte reichen ...
nepleurepas - Do 17.04.08 14:22
BenBE hat folgendes geschrieben: |
Gehört das Fenster zu nem ganzen Prozess, der beendet wird, wenn das Fenster geschlossen wird???
|
Nein. Wenn das Fenster geschlossen wird, öffnet sich ein zweites Fenster mit gleichem Titel, der prozess läuft weiter. Da sich dieses zweite fenster mit gleichem titel öffnet, bin ich mir auch nicht sicher, ob das mit dem handle suchen funktioniert, da ja das neue fenster den gleichen titel hat.
Oder haben unterschiedliche fenster mit gleichem titel verschiedene handles? Das wär nähmlich auch noch ne frage für mich. Wie kann ich versch. fenster mit gleichem titel unterscheiden? Also wenn ich sie mit postmessage ansprechen will.
Könnte man iwie mit getmessage mitbekommen, wann das fenster geschlossen wird?
BenBE - Do 17.04.08 14:31
Verschiedene Fenster(-Instanzen) haben unterschiedliche Handles.
Teilweise haben die dann auch noch unterschiedliche Fenster-Klassen, daran könnte man das auch noch fest machen ...
nepleurepas - Do 17.04.08 14:49
Ja mein problem is, wenn ich jetz per findwindow und dem fensternamen das handle finde, wie kann ich dann wissen, welches fenster-handle ich erwischt habe?
Kann ich vllt auch nach der größe der fenster gehen? Kann ich über ein handle herausfinden, wie groß das fenster ist?
Und wie kann ich das mit dem regelmäßigen abfragen machen? Mit sleep erscheint mir das sehr dilletantisch und rechenleistung raubend...
BenBE - Do 17.04.08 14:55
nepleurepas hat folgendes geschrieben: |
| Ja mein problem is, wenn ich jetz per findwindow und dem fensternamen das handle finde, wie kann ich dann wissen, welches fenster-handle ich erwischt habe? |
Indem Du weitere Informationen des Fensters abfragst???
nepleurepas hat folgendes geschrieben: |
| Kann ich vllt auch nach der größe der fenster gehen? Kann ich über ein handle herausfinden, wie groß das fenster ist? |
Ja, geht. Die Größe sollte man aber nicht hernehmen, wenn der User diese verändern kann ...
nepleurepas hat folgendes geschrieben: |
| Und wie kann ich das mit dem regelmäßigen abfragen machen? Mit sleep erscheint mir das sehr dilletantisch und rechenleistung raubend... |
Timer auf ein Interval von ~5-10 Sekunden (oder u.U. auch kürzer je nach Anwendung) einstellen ...
Eigentlich alles was die VCL an Möglichkeiten bietet, geht direkt oder Indirekt auch über die WinAPI abzufragen ...
nepleurepas - Do 17.04.08 15:21
das problem das sich glaube ich ergibt, wenn ich das über son ständiges abfragen ergibt is folgendes.
Mein ziel ist es, ein Programm zu imitieren. Wenn das erste fenster gschlossen wurde (vom orginalprogramm), geht ein fenster mit einem bild auf. Mein programm soll nun dieses zweite fenster schließen und ein neues, imitiertes, fenster aufmachen. D.h. also, mein programm muss sofort mitbekommen, wann das erste fenster geschlossen wurde, damit es sofort die weiteren schritte ausführen kann. Wenn die "reaktionsphase" zulange dauert, fliegt der fake sofort auf.
Dass du jetzt nich denkst ich plan iwas krummes, es geht um ein physik-programm, bei dem ich den kopf eines bekannten physiker durch den meines lehrer ersetzen möchte. Das das bild des physikers nicht so vorliegt, eben die idee mit dem nachbauen des fensters.
noch ne frage, wie komm ich an die größe des fensters ran, wenn ich dessen handle habe? Ne zeile code wäre nett :-)
thx für de antworten
Lossy eX - Do 17.04.08 16:13
Sleep ist nicht Rechenlastig, denn das legt den Prozess richtig schlafen. Aber das muss man nicht. Bzw ist Windows eventbasiert also sollte man auch events dafür benutzen. Im Konkreten meine ich einen TTimer. Selbst wenn du das Intervall auf 5-20 (millisekunden) stellst sollte die Rechenleistung sich wirklich in Grenzen halten.
Zum Erfragen der Position kannst du die Funktion GetWindowInfo benutzen. Diese liefert dir eine Struktur mit vielen Informationen des Fensters. Alternativ geht auch GetWindowRect. Diese liefert aber nur die Position.
Beide Methoden haben als Rückgabewert ein Boolean. Wenn das Fensterhandle nicht gültig ist, dann liefert die Methode false zurück. Ansonsten true. Und Windows vergibt jedem Fenster ein neues Handle. Dabei werden gerade frisch gelöschte Fenster aber nicht sofort wieder vergeben. Du kannst also die Methoden benutzen um zu überprüfen ob die Fenster noch existieren oder nicht.
BenBE - Do 17.04.08 16:16
Kleiner Hinweis vorweg: Beachte bitte, dass dein Vorhaben stark in der Grauzone von
Artikel 5.4 der Richtlinien [
http://www.delphi-forum.de/sites.php?id=9] liegt...
Zum Ändern des Bildes bietet sich ein Resourcen-Editor wahrscheinlich eher an. Wie man damit umgeht, fällt allerdings unter Artikel 5.2\5.5, daher dazu keine Antwort.
Ansonsten halt das was auch schon
Lossy eX sagte. GetWindowPos gibt's auch nich. IsVisible wäre ne alternative, falls das Fenster nur ausgeblendet wird.
nepleurepas - Fr 18.04.08 19:29
BenBE hat folgendes geschrieben: |
Kleiner Hinweis vorweg: Beachte bitte, dass dein Vorhaben stark in der Grauzone von Artikel 5.4 der Richtlinien [http://www.delphi-forum.de/sites.php?id=9] liegt...
Zum Ändern des Bildes bietet sich ein Resourcen-Editor wahrscheinlich eher an. Wie man damit umgeht, fällt allerdings unter Artikel 5.2\5.5, daher dazu keine Antwort.
Ansonsten halt das was auch schon Lossy eX sagte. GetWindowPos gibt's auch nich. IsVisible wäre ne alternative, falls das Fenster nur ausgeblendet wird. |
okay, vielen dank an alle, jetz sollte ich weiterkommen :-)
p.s.: wegen der grauzone... ist ja wirklich nur für den kleinen schulkreis der fachschaft physik. und da dass programm sowieso shareware is und meine lehrer sich auch eher geehrt fühlen wird, als beleidigt, sollte das meiner meinung nach kein problem sein
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!