Autor Beitrag
skyworxx
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 03.01.07 14:44 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 03.01.07 15:25 
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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: 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):

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 04.01.07 14:04 
also im moment bin ich hier:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Do 04.01.07 20:17 
ausblenden 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