Autor |
Beitrag |
skyworxx
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 03.01.07 13:45
hallo
ich arbeite grade an einem programm das überprüfen soll ob ein icq-fenster im hintergrund geöffnet ist.
um das fenster zu finden benutz ich folgenden code:
Delphi-Quelltext 1:
| FindWindow(nil,PChar(edit1.text+version)); |
jedoch wird da natürlich auch ein fenster gefunden das grad im vordergrund ist, das ist jedoch nicht sinn der sache.
wie finde ich nun heraus ob das fenster gerade minimiert ist oder sich im hintergrund befindet, also quasi alles andere als vordergrund eben
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 03.01.07 13:51
Probier mal, ob du mit GetWindowLong weiterkommst. Mehr dazu in der Delphi-Hilfe oder bei MSDN.
_________________ We are, we were and will not be.
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 03.01.07 14:44
Delphi-Quelltext 1:
| CurrentStyle := GetWindowLong(Handle, GWL_STYLE); |
damit probiers ich grad. es liefert mit 3 werte. entweder 0 wenn das fenster garnich da is, dann einmal -177irgendwas wenn es geöffnet ist und dann noch -22irgendwas wenn das fenster nicht geöffnet ist aber existiert (des blinkt dann in der traybar)
soweit schon ganz gut, jedoch erkenn ich das fenster nicht wenn es nur im hintergrund ist und blinkt. jemand ne idee wie ich herausfiden kann ob das fenster grade blinkt oder nicht?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 03.01.07 14:50
Weshalb das nicht geht: Wenn das Fenster versucht, den Eingabe-Fokus zu bekommen, dann ist das kein Fenster-Stil/-Typ.
Und deshalb geht auch GetWindowLong nicht.
Leider habe ich bis jetzt nichts dazu gefunden, wie man es herausfindet. Ich such aber noch weiter. Aber erstmal wollte ich sagen, warums mit GetWindowLong nicht geht.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 03.01.07 14:53
Ins Blaue geraten, aber könnte man nicht mit dem Parameter GWL_ExSTYLE arbeiten, um genauere Informationen zu erhalten?
_________________ We are, we were and will not be.
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 03.01.07 14:54
aso, das ist schade
könnte man eventuell abfragen ob das trayicon eines programms in der traybar ist?
bei icq heißen die trayicons "Nachricht von [Name]"
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 03.01.07 14:55
Gausi hat folgendes geschrieben: | Ins Blaue geraten, aber könnte man nicht mit dem Parameter GWL_ExSTYLE arbeiten, um genauere Informationen zu erhalten? |
exstyle liefert mir nur 2 werte: 0 und 66irgendwas, egal ob das fenster minimiert oder im hintergrund ist
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Mi 03.01.07 15:25
skyworxx hat folgendes geschrieben: | hallo
ich arbeite grade an einem programm das überprüfen soll ob ein icq-fenster im hintergrund geöffnet ist.
um das fenster zu finden benutz ich folgenden code:
Delphi-Quelltext 1:
| FindWindow(nil,PChar(edit1.text+version)); |
jedoch wird da natürlich auch ein fenster gefunden das grad im vordergrund ist, das ist jedoch nicht sinn der sache.
wie finde ich nun heraus ob das fenster gerade minimiert ist oder sich im hintergrund befindet, also quasi alles andere als vordergrund eben |
Hallo,
das erfährt man mit GetForegroundWindow (Überraschung...).
Gruss Reinhard
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 03.01.07 15:49
danke, jetz bleibt leider noch das problem das ein offenes fenster, was jedoch nicht in der taskleiste oder als icon in der traybar blinkt auch gefunden wird, selbst dann wenn dort grade nichts passiert
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Mi 03.01.07 16:22
skyworxx hat folgendes geschrieben: | danke, jetz bleibt leider noch das problem das ein offenes fenster, was jedoch nicht in der taskleiste oder als icon in der traybar blinkt auch gefunden wird, selbst dann wenn dort grade nichts passiert |
Hallo,
das mit der Traybar muss ich auch erst noch reinbasteln, aber probiers mal nach folgendem Muster (FIWindow ist das gefundene Handle der anderen Anwendung):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| OWindow := GetWindow (FIWindow,GW_OWNER); if OWindow > 0 then if IsIconic (OWindow) then ShowWindow (OWindow,sw_Restore); PopupWindow := GetLastActivePopup (FIWindow); if PopupWindow > 0 then FIWindow := PopupWindow; FGThread := GetWindowThreadProcessID (GetForegroundWindow,nil); OtherThread := GetWindowThreadProcessID (FIWindow,nil); AttachThreadInput (FGThread,OtherThread,true); SetForegroundWindow (FIWindow); AttachThreadInput (FGThread,OtherThread,false); |
(das aktiviert bei mir bei einem erneuten Aufruf das bereits laufende Programm)
Gruss Reinhard
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 03.01.07 20:23
ich beschäftige mich erst seit kurzem wieder mit delphi..der code von dir sag mir leider garnichts
sry
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Mi 03.01.07 20:28
skyworxx hat folgendes geschrieben: | ich beschäftige mich erst seit kurzem wieder mit delphi..der code von dir sag mir leider garnichts
sry |
kurz gesagt, SetForegroundWindow kann nur dann auf ein fremdes Fenster einwirken, wenn man den fremden Thread mit AttachThreadInput an den eigenen Thread "anbindet" - sonst ist der Aufruf einfach wirkungslos.
Beides ist Win32 API und nicht Delphi.
Gruss Reinhard
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 03.01.07 21:09
ah, danke, wieder was gelernt
jedoch wie überprüf ich jetz ob das fenster im hintergrund blinkt oder einfach nur so da ist? gibt es eine funktion die mir den style in der taskleiste liefert?
also im moment bin ich soweit zu erkennen ob ein fenster in der traybar existiert, denn wenn "[Name] - Nachrichtensitzung" in der traybar blinkt liefert es mir den wert 22irgendwas. fehlt jetz nurnoch das mit der taskleiste
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Do 04.01.07 14:04
also im moment bin ich hier:
Delphi-Quelltext 1: 2: 3:
| Handle:=FindWindow(nil,PChar('Peter - Nachrichtensitzung')); CurrentStyle := GetWindowLong(Handle, GWL_STYLE); label4.caption:=inttostr( CurrentStyle) ; |
nur blinkendes trayicon ergibt: 3054436420
fenster im hintergrund, nicht blinkend: 2517565508
fenster im hintergrund, blinkend: 2517565508
fenster geschlossen: 0
wie gesagt, das problem ist zu erkennen ob das fenster im hintergrund blinkt
evtl kann man das auch umgehen wenn man nur überprüft ob day trayicon da ist. denn immer wenn es blinkt, ist auch das trayicon da.
aber wie überprüfe ich ob ein trayicon existiert? den namen weiß ich auch nicht sicher, aber wenn ich mit der maus drüber halte erscheint diese kleine hellgelbe box und in der steht "Nachricht von [Name]"
|
|
skyworxx 
Hält's aus hier
Beiträge: 10
|
Verfasst: Do 04.01.07 20:17
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function FindWindowByTitle(WindowTitle: string): Hwnd; var NextHandle: Hwnd; NextTitle: array[0..260] of char; begin NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST); while NextHandle > 0 do begin GetWindowText(NextHandle, NextTitle, 255); if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then begin Result := NextHandle; Exit; end else NextHandle := GetWindow(NextHandle, GW_HWNDNEXT); end; Result := 0; end; |
ich hab damit versucht das trayicon zu finden, doch leider funktioniert das nicht
|
|