Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Taskleiste - Buttonblinken (https://www.delphipraxis.net/12000-taskleiste-buttonblinken.html)

sonic 18. Nov 2003 16:28


Taskleiste - Buttonblinken
 
Hallo alle zusammen!

Hätte eine Frage, hab schon gesucht, aber nicht gefunden...
Ich möchte gerne den Button in der Taskleiste blinken lassen,
so wies manche Programme ja tun, um auf sich aufmerksam zu machen.

Blos wie?

mfg Sonic :?:

MathiasSimmack 18. Nov 2003 17:26

Re: Taskleiste - Buttonblinken
 
Code:
BOOL FlashWindow(
  HWND hWnd,
  BOOL bInvert
);
1. Parameter = Handle der Anwendung (bei VCL, IMHO "Application.Handle")
2. Parameter = true, dann blinkt´s

sonic 18. Nov 2003 19:25

Re: Taskleiste - Buttonblinken
 
Danke erstmal,

Habe schon mal ausprobiert.
Verhält sich aber ein bisschen komisch - Blinkt zwar, aber...
Ich habe Windows XP, weiß nicht ob das eine Rolle spielt?
Wenn ich folgenden Code verwende, dann leuchtet der Taskleisten-Button am Schluss nach dem das Fenster wieder maximiert ist immer!?
zu Beginn:

Timer1 = TTimer;
Timerintervall = 500
Enabled = FALSE

Code:


procedure TForm1.Button1Click(Sender: TObject);
begin
   Application.Minimize;
   Timer1.Enabled := TRUE;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   FlashWindow(Application.Handle, TRUE);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnRestore := DoOnRestoreApplication;
end;

procedure TForm1.DoOnRestoreApplication(Sender : TObject);
begin
  Timer1.Enabled := FALSE;
end;

Mfg Sonic
:gruebel:

Stanlay Hanks 18. Nov 2003 19:38

Re: Taskleiste - Buttonblinken
 
Ich kenn mich da ja nicht aus, aber vielleicht brauchst du dazu gar keinen Timer, sondern musst, wenn es aufhören soll zu blinken einfach

Delphi-Quellcode:
   FlashWindow(Application.Handle, FALSE);
schreiben.
Ich gehe davon aus, dass das einfach nur dem System sagt, dass der Button jetzt blinken soll, bis man ihm sagt, es soll damit aufhören.

Man liest sich, Stanlay :hi:

MathiasSimmack 18. Nov 2003 19:41

Re: Taskleiste - Buttonblinken
 
Eben nicht.
Zitat:

Zitat von PSDK
The FlashWindow function flashes the window only once; for repeated flashing, the application should create a system timer.

For an example, see Notifying the User of Errors:
Code:
FlashWindow(hwnd, TRUE); // invert the title bar
Sleep(500);             // wait a bit
FlashWindow(hwnd, TRUE); // invert again
 
// Play the system exclamation sound.
 
MessageBeep(MB_ICONEXCLAMATION);


Stanlay Hanks 18. Nov 2003 19:43

Re: Taskleiste - Buttonblinken
 
Zitat:

Zitat von MathiasSimmack
Eben nicht.

Ich hab ja nur gemeint :oops:

MathiasSimmack 18. Nov 2003 19:45

Re: Taskleiste - Buttonblinken
 
Ja, war ja auch nicht böse gemeint. Habe eben bloß fix im PSDK nachgeschaut ... ich geb´s ja zu ... :cheers:

sonic 18. Nov 2003 19:48

Re: Taskleiste - Buttonblinken
 
In der Hilfe steht das man einen Timer dafür braucht...

Ich bin draufgekommen, das es manchmal schon funktioniert.
Ich hab auch schon, folgendes versucht...

Delphi-Quellcode:
procedure TForm1.DoOnRestoreApplication(Sender : TObject);
begin
* Timer1.Enabled := FALSE;
  FlashWindow(Application.Handle, FALSE);
end;
Also am Schlss nochmal FALSE schalten. Machts aber noch schlimmer.
Hab die Funktion auch schon einzeln nur in ein Button Click getan,
um zu sehen was sie macht. Mir unklar :gruebel:

Mfg Mike

MathiasSimmack 18. Nov 2003 20:06

Re: Taskleiste - Buttonblinken
 
Die Funktion invertiert die Titelleiste des Fensters (bzw. den Button in der Startleiste) genau einmal. Aus einer aktiven Titelzeile wird so
Delphi-Quellcode:
FlashWindow(self.Handle,true);
eine inaktive. Um den Vorgang umzukehren und die Titelzeile wieder als aktiv darzustellen, musst du die Funktion noch einmal aufrufen - und genau so wie zuvor:
Delphi-Quellcode:
FlashWindow(self.Handle,true);
"false" als zweiter Parameter bedeutet nur, dass die Titelzeile in ihren ursprünglichen Zustand versetzt wird. War sie also inaktiv, wird sie das auch wieder. War sie aktiv, dann wird sie durch "false" eben wieder aktiv.

Ein typisches Geblinke der Fenstertitelzeile via Button-Klick und ohne Timer:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  for i := 1 to 4 do begin
    FlashWindow(self.Handle,true);
    if(i < 4) then sleep(60);
  end;
end;

Luckie 18. Nov 2003 20:08

Re: Taskleiste - Buttonblinken
 
Ich werfe noch mal ganz mutig ein FlashWindowEx in die Runde. *werf*
Da kann man alles einstellen, wie oft, wie lange, wo, warum, weshalb, ...

MathiasSimmack 18. Nov 2003 20:13

Re: Taskleiste - Buttonblinken
 
Zitat:

Zitat von Luckie
Ich werfe noch mal ganz mutig ein FlashWindowEx in die Runde. *werf*

*fang*

Zitat:

Da kann man alles einstellen, wie oft, wie lange, wo, warum, weshalb, ...
Also, wie lange und wo (Titelzeile oder Taskbar-Button): Ja. Aber Warum und Weshalb? :?

:)

toms 18. Nov 2003 20:18

Re: Taskleiste - Buttonblinken
 
Ein FlashWindowEx Beispiel gibt's hier.

MathiasSimmack 18. Nov 2003 20:18

Re: Taskleiste - Buttonblinken
 
Außerdem gibt´s ein Problem bei (oder besser: mit) der VCL.

Membervariable "hwnd" definiert das Handle des Fensters das Blinken soll. Bei der VCL gibt´s aber zwei Fenster. Die Form (Form.Handle, self.Handle) und der Button in der Taskleiste, für den das TApplication-Objekt verantwortlich ist (Application.Handle). Demzufolge blinkt immer nur eins der beiden, obwohl es das Flag "FLASHW_ALL"
Zitat:

Zitat von PSDK
Flash both the window caption and taskbar button. This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags

gibt. Na ja, muss man halt einen Kompromiss machen.

Bei nonVCL gibt´s das Problem nicht.

sonic 19. Nov 2003 16:40

Re: Taskleiste - Buttonblinken
 
Hallo!

Danke für die vielen Tipps.
Habe mich für FlashWindowEx entschieden, weils einfacher das erfüllt, was ich brauche.
Das mit dem leuchten am Schluss ist bei beiden so, hab aber rausgefunden wie das gehen soll.

Wenn die Applikation minimiert ist, dann löst man das blinken aus, wie auch immer. Stopt man das Blinken oder ist der Count erreicht (FlashWindowEx), bleibt der Button leuchtend, bis man die Application wieder maximiert. Das ist scheinbar so. Dann ist wieder alles normal.

Mfg Sonic. :-D

rainerg 28. Jan 2004 15:37

Re: Taskleiste - Buttonblinken
 
Wie bringe ich das Taskleistensymbol dazu nur BLAU zu werden, also ohne das es blinkt. Irgendwie steckt die Antwort hier im Thread drin, aber irgendwie komme ich nicht drauf :-(

rainerg 28. Jan 2004 16:12

Re: Taskleiste - Buttonblinken
 
Inzwischen selber gelöst :-)

Man darf halt nicht gleich nach FlashWindow den Taskleistentext ändern, dann wird alles wieder normal dargestellt (FlashWindow mit false muß dann trotzdem gemacht werden, weil intern ist es trotzdem noch markiert).

Scycs 5. Dez 2005 07:19

Re: Taskleiste - Buttonblinken
 
:wall: hab dreimal hintereinander denselben Blinkzeitpunkt erwischt so das es klappte, nur beim vierten mal grad eben natürlich nicht. Na gut so einfach geht es dann doch nicht...

MatzeB 16. Dez 2005 11:02

Re: Taskleiste - Buttonblinken
 
Moin!

Hallo erstmal, bin der Neue hier :sharkylinchen:
Hab noch eine Lösung für das Blinken vom Button (Taskleiste)gefunden.
Ist zwar nicht hochentwickelt, aber wenn man das entsprechende Form mit einem Timer versieht und dann folgendes tut:
Code:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
        Application.BringToFront;
end;
springt zwar das Form gleich wieder nach vorne, aber wenn man es wieder nach hinten schiebt, blinkt der Button in der Leiste.

Greetz,

Matze


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz