Entwickler-Ecke

Windows API - feststellen ob ein fenster im hintergrund geöffnet ist


skyworxx - Mi 03.01.07 13:45
Titel: feststellen ob ein fenster im hintergrund geöffnet ist
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 - Mi 03.01.07 13:51

Probier mal, ob du mit GetWindowLong weiterkommst. Mehr dazu in der Delphi-Hilfe oder bei MSDN.


skyworxx - 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 - 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 - 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?


skyworxx - 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 - Mi 03.01.07 14:55

user profile iconGausi 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 - Mi 03.01.07 15:25
Titel: Re: feststellen ob ein fenster im hintergrund geöffnet ist
user profile iconskyworxx 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 - 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 - Mi 03.01.07 16:22

user profile iconskyworxx 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 - 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 - Mi 03.01.07 20:28

user profile iconskyworxx 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 - 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 - 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 - 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..260of char;
begin
  // Get the first window
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin
    // retrieve its text
    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else
      // Get the next window
      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;


ich hab damit versucht das trayicon zu finden, doch leider funktioniert das nicht